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

分析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(Stringname,boolean resolve)

此方法的默认实现将按以下顺序搜索类:

1.调用findLoadedClass(name)来检查是否已经加载类。

2.在父类加载器上调用 loadClass方法。如果父类加载器为 null,则使用虚拟机的内置类加载器。

3.调用findClass(name)方法查找类。











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

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




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值