分析BootstrapClassLoader/ExtClassLoader/AppClassLoader的加载路径 及"父委托机制"

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/irelandken/article/details/7048817
分析BootstrapClassLoader/ExtClassLoader/AppClassLoader的加载路径及"父委托机制"

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("----------------------------");	
	}
}

运行时输出如下:


BootstrapClassLoader 的加载路径: 
file:/C:/jdk1.7.0_01/jre/lib/resources.jar
file:/C:/jdk1.7.0_01/jre/lib/rt.jar
file:/C:/jdk1.7.0_01/jre/lib/sunrsasign.jar
file:/C:/jdk1.7.0_01/jre/lib/jsse.jar
file:/C:/jdk1.7.0_01/jre/lib/jce.jar
file:/C:/jdk1.7.0_01/jre/lib/charsets.jar
file:/C:/jdk1.7.0_01/jre/classes
----------------------------
sun.misc.Launcher$ExtClassLoader@3e389405
扩展类加载器 的加载路径: 
file:/C:/jdk1.7.0_01/jre/lib/ext/dnsns.jar
file:/C:/jdk1.7.0_01/jre/lib/ext/localedata.jar
file:/C:/jdk1.7.0_01/jre/lib/ext/sunec.jar
file:/C:/jdk1.7.0_01/jre/lib/ext/sunjce_provider.jar
file:/C:/jdk1.7.0_01/jre/lib/ext/sunmscapi.jar
file:/C:/jdk1.7.0_01/jre/lib/ext/zipfs.jar
----------------------------
sun.misc.Launcher$AppClassLoader@a200d0c
应用(系统)类加载器 的加载路径: 
file:/E:/JAVA/JVM_Class_Reflect_Thread/ClassPath_of_Bootstrap_Ext_AppClassLoader/bin/
----------------------------


现在我们就知道了这三个类加载器的加载路径了:
  • BootstrapClassLoader                  ---加载jre/目录下的核心库

  • ExtClassLoader扩展类加载器              ---加载/jre/lib/ext/目录下的扩展包

  • AppClassLoader应用(系统)类加载器        ---加载CLASSPATH路径下的包





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) 方法查找类。











/////////-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

PS: 如果用户想从自定义的目录下加载类(.class文件),则可以自定义类加载器:




展开阅读全文

没有更多推荐了,返回首页