import java.net.URL; import java.net.URLClassLoader; /* 分析BootstrapClassLoader/ExtClassLoader/AppClassLoader的加载路径 * */ public class ClassPath_of_Bootstrap_Ext_AppClassLoader { public static void main(String[] args) { System.out.println("BootstrapClassLoader 的加载路径: "); URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs(); for(URL url : urls) System.out.println(url); System.out.println("----------------------------"); //取得扩展类加载器 URLClassLoader extClassLoader = (URLClassLoader)ClassLoader.getSystemClassLoader().getParent(); System.out.println(extClassLoader); System.out.println("扩展类加载器 的加载路径: "); urls = extClassLoader.getURLs(); for(URL url : urls) System.out.println(url); System.out.println("----------------------------"); //取得应用(系统)类加载器 URLClassLoader appClassLoader = (URLClassLoader)ClassLoader.getSystemClassLoader(); System.out.println(appClassLoader); System.out.println("应用(系统)类加载器 的加载路径: "); urls = appClassLoader.getURLs(); for(URL url : urls) System.out.println(url); System.out.println("----------------------------"); } }
JDK源代码中,protected Class<?> loadClass(String name, boolean resolve) 方法
已经很好地体现出"父亲委托机制":
1:先调用parent.loadClass(name, false)
2:如果父亲加载失败,则调用 loadClass(name, false) 方法 查找"当前类加载器"对应的"目录"来加载
public Class<?>loadClass(String name, boolean resolve)
此方法的默认实现将按以下顺序搜索类:
1.调用 findLoadedClass(name) 来检查是否已经加载类。
2.在父类加载器上调用 loadClass方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。
3.调用 findClass(name) 方法查找类。