类加载器
对于任意一个类,都需要由加载它的类加载器这个类本身一同确立起在Java虚拟机中的唯一性,下面将采用书中的例子进行试验说明。
import java.io.IOException;
import java.io.InputStream;
/* * 对于任意一个类,都需要由加载它的类加载器这个类本身一同确立起在Java虚拟机中的唯一性 * 每一个类加载器,都拥有独立的类名称空间。 * 即 比较两个类是否相等,只要这两个类是由同一个类加载器加载的前提下才有意义。 * 类加载器与instanceof关键字的演示 */
public class ClassLoaderDemo {
/** * @param args * @throws ClassNotFoundException * @throws IllegalAccessException * @throws InstantiationException */
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
// TODO Auto-generated method stub
ClassLoader myLoader = new ClassLoader() {
@Override
//自定义类加载器
public Class<?> loadClass(String name)
throws ClassNotFoundException {
try {
//System.out.println(name);
// TODO Auto-generated method stub
String filename = name.substring(name.indexOf("." )+ 1)
+ ".class";
InputStream is = getClass().getResourceAsStream(filename);
if (is == null) {
return super.loadClass(name);
}
byte[] b = new byte[is.available()];
is.read(b);
return defineClass(name, b, 0, b.length);
} catch (IOException e) {
// TODO: handle exception
throw new ClassNotFoundException(name);
}
}
};
Object obj;
try {
//调用自定义类加载器得到类实例
obj = myLoader.loadClass("类加载机制和反射.ClassLoaderDemo").newInstance();
System.out.println(obj.getClass());
System.out.println(obj instanceof 类加载机制和反射.ClassLoaderDemo);
//使用系统应用程序类加载器加载的
Object obj1 = new ClassLoaderDemo();
System.out.println(obj1 instanceof 类加载机制和反射.ClassLoaderDemo);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
试验结果如下:
class 类加载机制和反射.ClassLoaderDemo
false
true
原因:
虚拟机中存在了两个ClassLoaderDemo类,一个是由系统应用程序类加载的, 另一个是由我们自定义的类加载器加载的,虽然来自同一个Class文件,但是仍然是两个独立的类
还没有评论,来说两句吧...