理解双亲委派

1. 什么是双亲委派机制,双亲委派模型的好处

双亲委派机制就是把加载类的操作优先交给父加载器完成,如果父加载器还有夫加载器则进一步往上传递工作,等父加载器加载不了的时候,才会交给自己执行 优点: 避免了重复加载,避免核心类被篡改。 举例: 假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。 一段示例代码 public class DifferentClassLoaderTest {

public static void main(String[] args) throws Exception {
    ClassLoader classLoader = new ClassLoader() {
        @Override
        public Class<?> loadClass(String name) throws ClassNotFoundException {
            String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
            InputStream stream = getClass().getResourceAsStream(fileName);
            if (stream == null) {
                return super.loadClass(name);
            }
            try {
                byte[] b = new byte[stream.available()];
                // 将流写入字节数组b中
                stream.read(b);
                return defineClass(name, b, 0, b.length);
            } catch (IOException e) {
                e.printStackTrace();
            }

            return super.loadClass(name);
        }
    };
    Object obj = classLoader.loadClass("jvm.DifferentClassLoaderTest").newInstance();
    System.out.println(obj.getClass());
    System.out.println(obj instanceof DifferentClassLoaderTest);

}}

输出结果: class jvm.DifferentClassLoaderTest false