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的类加载器