java不同类加载器对instanceof关键字运算的影响

内容:对于任意的一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类空间。只要加载类的类加载器不同的话,那么这个两个类就必定不相等(包括equals()方法,instanceof()方法)。此时,虚拟机中存在两个ClassLoaderTest,一个是由系统应用程序类加载器加载的,另一个是由我们定义的类加载器加载的。一个简单的例子说明:注意getResourceAsStream的应用:Class.getResourceAsStream(String path):path 不以"/"开头时默认是从此类所在的包下取资源,以"/"开头则是从ClassPath根下获取,也就是bin开始。

public class ClassLoaderTest {

	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		ClassLoader myLoader = new ClassLoader() {
			@Override
			public Class loadClass(String name) throws ClassNotFoundException {
				try {
					String className = name.substring(name.lastIndexOf(".") + 1) + ".class";
					
					//返回读取指定资源的输入流
					InputStream is = getClass().getResourceAsStream(className);
					if (is == null) return super.loadClass(name);
					byte[] b = new byte[is.available()];
					is.read(b);
					
					//将一个byte数组转换为Class类的实例
					return defineClass(name, b, 0, b.length);
				} catch (IOException e) {
					throw new ClassNotFoundException(name);
				}
			}
		};
		
		Object object = myLoader.loadClass("test.ClassLoaderTest").newInstance();
		System.out.println(object.getClass());
		System.out.println(object instanceof test.ClassLoaderTest);
	}
}


你可能感兴趣的:(J2EE,J2SE,Tomcat)