JVM类加载器的urlclassloader和appclassloader

package kite.jvm;

import java.net.URL;

/**
 * 首先为什么(1)可以,因为OneURLClassLoader在加载Constant的时候发现需要加载
 * OneInterface(因为他是其接口),因为OneURLClassLoader找不到OneInterface,所以最终委其父也就是appclassloader加载了OneInterface.
 * 而(2)不可以,因为外部的Constant instance2
 * 是appclassloader加载的,而内部的即C是OneURLClassLoader加载的,当然不能转换.
 * 
 * @author admin
 *
 */
public class Run {
	public static void main(String[] args) throws Exception {
		// class字节码所在的位置.
		String dir = "file:/E:\\datacloudWorkspace8\\JbossWebTest\\build\\classes\\";
		URL url = new URL(dir);
		OneURLClassLoader oucl = new OneURLClassLoader(new URL[] { url });
		// 用类加载器加载kite.jvm.Constant并返回它的class对象.
		Class c = oucl.findClass("kite.jvm.Constant");// 直接加载,不依靠父委托机制
		/**
		 * kite.jvm.OneURLClassLoader@6d06d69c:sun.misc.Launcher$AppClassLoader@73d16e93
		 * sun.misc.Launcher$AppClassLoader@73d16e93
		 * sun.misc.Launcher$AppClassLoader@73d16e93
		 */
		/*
		 * Class c = oucl.loadClass("kite.jvm.Constant"); // 结果:
		 * 依赖父委托机制sun.misc.Launcher$AppClassLoader@73d16e93:sun.misc.
		 * Launcher$ExtClassLoader@6d06d69c sun.misc.Launcher$AppClassLoader@73d16e93
		 * sun.misc.Launcher$AppClassLoader@73d16e93
		 */ System.out.println(c.getClassLoader() + ":" + c.getClassLoader().getParent());
		System.out.println(OneInterface.class.getClassLoader());
		System.out.println(Constant.class.getClassLoader());

		// 根据class对象c实例化一个对象,用它的接口类型(OneInterface)做类型转换.
		OneInterface instance1 = (OneInterface) c.newInstance();
		// 根据class对象c实例化一个对象,用它的实际类型(Constant)做类型转换.
		Constant instance2 = (Constant) c.newInstance();
		System.out.println(instance1);// (1)
		System.out.println(instance2);// (2)
	}
}

interface OneInterface {
	void say();
}

class Constant implements OneInterface {

	@Override
	public void say() {
		// TODO Auto-generated method stub
		System.out.println("aaaaaaaa");
	}
}
http://www.iteye.com/problems/77669

你可能感兴趣的:(jvm)