类与类加载器
比较两个类是否"相等",只有在这两个类是由同一个类加载器加载的前提下才有意义,
否则,即使这两个类来源于同一个Class文件,被同一个虚拟机加载,只要加载他们的类加载器不同,那这两个类就必定不相等。
1 /** 2 * 类加载器与instanceof关键字演示 3 * 4 * @author zzm 5 */ 6 package org.codeman; 7 8 import java.io.*; 9 10 public class ClassLoaderTest { 11 12 public static void main(String[] args) throws Exception { 13 14 ClassLoader myLoader = new ClassLoader() { 15 @Override 16 public Class<?> loadClass(String name) throws ClassNotFoundException { 17 try { 18 String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class"; 19 InputStream is = getClass().getResourceAsStream(fileName); 20 if (is == null) { 21 return super.loadClass(name); 22 } 23 byte[] b = new byte[is.available()]; 24 is.read(b); 25 return defineClass(name, b, 0, b.length); 26 } catch (IOException e) { 27 throw new ClassNotFoundException(name); 28 } 29 } 30 }; 31 32 Object obj = myLoader.loadClass("org.codeman.ClassLoaderTest").newInstance(); 33 34 System.out.println(obj.getClass()); 35 System.out.println(obj instanceof org.codeman.ClassLoaderTest); 36 } 37 }
运行结果:
class org.codeman.ClassLoaderTest
false
两行输出结果中,从第一行可以看出,这个对象确实是org.codeman.ClassLoaderTest实例化出来的对象,但从第二句可以发现这个对象与类org.codeman.ClassLoaderTest 做所属类型检查的时候却返回了false, 这是因为虚拟机中存在了两个ClassLoaderTest类,一个是由系统应用程序类加载器加载的,另外一个是由我们自定义的类加载器加载的,虽然都来自同一个Class文件,但依然是两个独立的类,做对象所属类型检查时结果自然为false!