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的类加载器
浙公网安备 33010602011771号