http://blog.csdn.net/irelandken/article/details/7048817

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

[java] view plaincopyprint?
  1. import java.net.URL;
  2. import java.net.URLClassLoader;
  3. /*
  4. 分析BootstrapClassLoader/ExtClassLoader/AppClassLoader的加载路径
  5. *
  6. */
  7. public class ClassPath_of_Bootstrap_Ext_AppClassLoader
  8. {
  9. public static void main(String[] args)
  10. {
  11. System.out.println("BootstrapClassLoader 的加载路径: ");
  12. URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
  13. for(URL url : urls)
  14. System.out.println(url);
  15. System.out.println("----------------------------");
  16. //取得扩展类加载器
  17. URLClassLoader extClassLoader = (URLClassLoader)ClassLoader.getSystemClassLoader().getParent();
  18. System.out.println(extClassLoader);
  19. System.out.println("扩展类加载器 的加载路径: ");
  20. urls = extClassLoader.getURLs();
  21. for(URL url : urls)
  22. System.out.println(url);
  23. System.out.println("----------------------------");
  24. //取得应用(系统)类加载器
  25. URLClassLoader appClassLoader = (URLClassLoader)ClassLoader.getSystemClassLoader();
  26. System.out.println(appClassLoader);
  27. System.out.println("应用(系统)类加载器 的加载路径: ");
  28. urls = appClassLoader.getURLs();
  29. for(URL url : urls)
  30. System.out.println(url);
  31. System.out.println("----------------------------");
  32. }
  33. }
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文件),则可以自定义类加载器:


分析BootstrapClassLoader/ExtClassLoader/AppClassLoader的加载路径 及父委托机制相关推荐

  1. 类加载器 java委托机制_解析Java虚拟机中类的初始化及加载器的父委托机制

    类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始化: 2.在静态代码块中进行初始化. 没有 ...

  2. Android4.0图库Gallery2代码分析(二) 数据管理和数据加载

    Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...

  3. Tomcat源码分析——server.xml文件的加载

    前言 作为Java程序员,对于tomcat的server.xml想必都不陌生.本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载的进行分析. 源码分析 Bootstrap的 ...

  4. Mybatis 源码分析(一)配置文件加载流程

    Mybatis 源码分析(一)配置文件加载流程 1.项目构建 引入依赖 <dependency><groupId>org.mybatis</groupId>< ...

  5. 【Bug档案01】Spring Boot的控制器+thymeleaf模板 -使用中出现静态资源加载路径不当的问题 -解决时间:3h

    [Bug档案01]Spring Boot的控制器+thymeleaf模板 -使用中出现静态资源加载路径不当的问题 -解决时间:3h 参考文章: (1)[Bug档案01]Spring Boot的控制器+ ...

  6. linux path环境变量检索目录,Linux下动态链接库加载路径及搜索路径问题

    引子 近日,服务器迁移后,偷懒未重新编译nginx的,直接./nginx启动,结果遇到如下问题: "error while loading shared libraries" 这是 ...

  7. combotree 可以异步加载吗_Unity AssetBundle 资源打包,加载,本地缓存方式,安卓,PC本地加载路径问题...

    AssetBundle的定义和作用: 1,AssetBundle是一个压缩包包含模型.贴图.预制体.声音.甚至整个场景,可以在游戏运行的时候被加载. 2,AssetBundle自身保存着互相的依赖关系 ...

  8. Android之Launcher分析和修改4——初始化加载数据

    上面一篇文章说了Launcher是如何被启动的,Launcher启动的过程主要是加载界面数据然后显示出来, 界面数据都是系统APP有关的数据,都是从Launcher的数据库读取,下面我们详细分析Lau ...

  9. vue的v-for循环中图片加载路径问题

    vue的v-for循环中图片加载路径问题 产品要求 要求图片和它的名字一一对应, vue中的img的src可以动态绑定到一个变量上 <template> <div><ul ...

最新文章

  1. copy模块中的copy与deepcopy的区别
  2. CSS代码检查工具stylelint
  3. 【小白学习keras教程】二、基于CIFAR-10数据集训练简单的MLP分类模型
  4. UCMA(OCS) 开发系列之二(安装与部署)
  5. 【java】JOptionPane的基本操作
  6. 【Java学习笔记】数组的相关事项
  7. php工商亮照添加代码,市场监管总局电子营业执照亮照系统上线
  8. MarkDown基础语法笔记
  9. 致远oa系统报价_致远的OA办公系统成本多少一套?
  10. Excel 冻结首行
  11. USB-PD 协议解析 - 简单易懂协议详解
  12. safari 插件安装之alipay
  13. 进入IT行业,你后悔过吗?
  14. Google浏览器被劫持解决方法
  15. 轻松几步获得上万点击率(三)
  16. java智能卡开发_《Java智能卡原理与应用开发》PDF 下载
  17. js读取本地文本文件,并生成Excel文件
  18. 输出小数点后第n位数字
  19. Python批量处理Excel数据后,导入SQL Server
  20. 核心期刊《河北医学》杂志简介及投稿要求

热门文章

  1. 【数据结构与算法】之深入解析“字符串转换整数 (atoi)”的求解思路和算法示例
  2. 2018年第九届蓝桥杯 - 省赛 - C/C++大学B组 - G.螺旋折线
  3. 2017年第八届蓝桥杯 - 省赛 - C/C++大学A组 - C. 魔方状态
  4. 高级指引——概念解释——图形 Shape 及其属性
  5. 深入理解python中的select模块
  6. 《Python machine learning and practice》—— 良\恶性乳腺癌肿瘤预测
  7. 【机器视觉】Qt集成Halcon开发环境详解(一)
  8. 【数字图像】数字图像处理博客汇总
  9. 【STM32】光敏传感器示例
  10. 【Linux】一步一步学Linux——less命令(40)