new操作时调用当前线程的类加载器,还是调用方的类加载器

 默认使用forname方式?

 

两种类别的类加载器 阐述了2种类加载器,并认为,加载B的ClassLoader一定是加载A的ClassLoader本文实践证明new使用的是哪一种

设计:

MyMain

  lc3

    J new thread(myclassloader) {static new K}

    K

MySub

  lc3

    K

通过这个案例,看看K终究是被J.class.getClassloader 加载还是被当前线程的myclassloader加载

 

MyMain package lc3

public class J {
    static {
        System.out.println("父 J 加载");
        String dir = "file:/Users/sunyuming/Documents/tool/jars//MySub-1.0.0-jar-with-dependencies.jar";
        URL url = null;
        try {
            url = new URL(dir);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        URL[] urls2 = {url};

        // 若不指定parent参数,则默认由系统类加载器担任自定义类加载器的父加载器,输出parent:sun.misc.Launcher$AppClassLoader@3764951d
        MyUrlClassLoader myUrlClassLoader = new MyUrlClassLoader(urls2);
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                new K();
            }
        });
        thread.setContextClassLoader(myUrlClassLoader);
        thread.start();

    }

    private static class MyUrlClassLoader extends URLClassLoader {
        public MyUrlClassLoader(URL[] urls) {
            super(urls);
        }
    }
}

public class K {
    static {
        System.out.println("父 K 加载");
    }
}

public class Main {
    public static void main(String [] f) {
        J j = new J();
    }
}

 MySub package lc3

public class K {
    static {
        System.out.println("子 K 加载");
    }
}

 

输出:

父 J 加载
父 K 加载

 

说明new的方式默认不使用当前线程类加载器,否则应该加载MySub中的子K,而是用调用类的类加载器,即J的类加载器

posted on 2020-01-08 13:27  silyvin  阅读(569)  评论(0编辑  收藏  举报