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