标签:
内容:对于任意的一个类,都需要由加载它的类加载器和这个类本身一同确立其在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); } }
标签:
原文地址:http://blog.csdn.net/u011345136/article/details/45823423