1. 简单介绍

  1. Bootstrap、 ExtClassLoader、  AppClassLoader是java最根正苗红的类加载器。

  2. Bootstrap是本地代码编写的(例如C), ExtClassLoader、  AppClassLoader是java代码,且都在rt.jar中,且很巧的都是sun.misc.Launcher内部类(不过这个不是重点)。

  3. Bootstrap是爷爷、ExtClassLoader是爸爸、AppClassLoader是孩子(孙子)。但由于爸爸ExtClassLoader太忙了,所以照顾孩子AppClassLoader的责任就有爷爷Bootstrap来处理了(即,虽然ExtClassLoader是AppClassLoader老爸,但却是由爷爷Bootstrap加载的AppClassLoader。该情况与中国国情完全一样)。

2. 代码实验

Java代码  

  1. public class LoaderTest {

  2. /**

  3. * @param args

  4. */

  5. public static void main(String[] args) {

  6. new LoaderTest().test();

  7. }

  8. /**

  9. * @param args

  10. */

  11. public void test() {

  12. ClassLoader fatherLoader = this.getClass().getClassLoader();

  13. System.out.println("当前类的父加载器名称:" + fatherLoader.getClass().getName());

  14. // 这是因为AppClassLoader的父加载器虽然是ExtClassLoader,但是却是Bootstrap

  15. // 加载的(所以它的.getClassLoader()返回为null)

  16. // Bootstrap、 ExtClassLoader、  AppClassLoader的关系很符合中国过去,可以这么描述:ExtClassLoader是AppClassLoader的爸爸,但是AppClassLoader确实他爷爷Bootstrap一把屎一把尿喂大的。

  17. System.out.println("AppClassLoader的直接加载器是null吗:"

  18. + (fatherLoader.getClass().getClassLoader() == null));

  19. ClassLoader grandfatherLoader = fatherLoader.getParent();

  20. System.out.println("爷爷载器名称:" + grandfatherLoader.getClass().getName());

  21. }

  22. }

代码运行结果:

当前类的父加载器名称:sun.misc.Launcher$AppClassLoader
AppClassLoader的加载器是null吗:true
爷爷载器名称:sun.misc.Launcher$ExtClassLoader

3. 类加载器各自搜索的目录

1.Bootstrap Loader(启动类加载器):加载System.getProperty("sun.boot.class.path")所指定的路径或jar。通过System.out.println(System.getProperty("sun.boot.class.path"));打印,发现主要是“D:\Program Files\Java\jdk1.6.0_10\jre\lib”中的jar包。

2.Extended Loader(标准扩展类加载器ExtClassLoader):加载System.getProperty("java.ext.dirs")所指定的路径或jar。在使用Java运行程序时,也可以指定其搜索路径,例如:java -Djava.ext.dirs=d:\projects\testproj\classes HelloWorld。

通过打印System.out.println(System.getProperty("java.ext.dirs"));,可以发现主要加载目录为:

“D:\Program Files\Java\jdk1.6.0_10\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext

3、AppClass Loader(系统类加载器AppClassLoader):加载System.getProperty("java.class.path")所指定的路径或jar。在使用Java运行程序时,也可以加上-cp来覆盖原有的Classpath设置,例如: java -cp ./lavasoft/classes HelloWorld

对于eclipse,就是“.classpath”中的jar包。

ExtClassLoader和AppClassLoader在JVM启动后,会在JVM中保存一份,并且在程序运行中无法改变其搜索路径。如果想在运行时从其他搜索路径加载类,就要产生新的类加载器。

PS:这一段摘自lavasoft,地址见下。

参考:

http://hi.baidu.com/haifengjava/blog/item/498fd8365ef5c8390a55a9db.html

http://lavasoft.blog.51cto.com/62575/184547

java类加载器-Bootstrap、 ExtClassLoader、 AppClassLoader的关系的更多相关文章

  1. java类加载器 Bootstrap、ExtClassLoader、AppClassLoader的关系

    1.Bootstrap. ExtClassLoader. AppClassLoader是java最根正苗红的类加载器.2.Bootstrap是本地代码编写的(例如C), ExtClassLoader. ...

  2. java笔记--理解java类加载器以及ClassLoader类

    类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制 ...

  3. 深入探讨 Java 类加载器

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类加载器(class loader)是 Java™中的一个很重要的概念.类 ...

  4. 转载:深入探讨 Java 类加载器

    转载地址 : http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 深入探讨 Java 类加载器 类加载器(class loader) ...

  5. 【转】深入探讨 Java 类加载器

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html 类加载器是 Java 语言的一个创新,也是 Java ...

  6. 深入理解Java类加载器(1):Java类加载原理解析

    1 基本信息 每个开发人员对Java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java的类加载机制是技术体系中比较核心的 ...

  7. 深入探讨java类加载器

    概览 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1.0 就出现了,最初是为了满足 ...

  8. 深入探讨 Java 类加载器(转)

    原帖地址:https://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要 ...

  9. 转载 深入理解java类加载器

    1 基本信息 每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java的类加载机制是技术体系中比较核心的 ...

随机推荐

  1. 【朝花夕拾】Android自定义View篇之(一)View绘制流程

    前言 转载请申明转自[https://www.cnblogs.com/andy-songwei/p/10955062.html]谢谢! 自定义View.多线程.网络,被认为是Android开发者必须牢 ...

  2. 数据结构与算法---查找算法(Search Algorithm)

    查找算法介绍 在java中,我们常用的查找有四种: 顺序(线性)查找 二分查找/折半查找 插值查找 斐波那契查找 1)线性查找算法 示例: 有一个数列: {1,8, 10, 89, 1000, 123 ...

  3. [WPF自定义控件库]好用的VisualTreeExtensions

    1. 前言 A long time ago in a galaxy far, far away....微软在Silverlight Toolkit里提供了一个好用的VisualTreeExtensio ...

  4. python3.7 AES.MODE_ECB(128位) pkcs5padding 加密算法

    用惯用的写法总报TypeEerror错误,经过调试,总算成功啦,直接上代码 TypeError("Object type %s cannot be passed to C code" ...

  5. POI 身份证号码 手机号 日期值的处理方式

    private static SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); ...

  6. SqlCommand的Parameters的用法

    SqlCommand的Parameters的用法 可以用的SqlCommand的Parameters的方法SqlCommand cmd=new ("insert into notice(ly ...

  7. Kafka Eagle V1.3.4更新预览

    1.概述 Kafka Eagle是一款开源的Kafka集群监控系统,源代码托管在Github.目前Kafka Eagle已更新到V1.3.4版本,域名已经统一更新为http://www.kafka-e ...

  8. Drools规则引擎-判断集合(List)是否包含集合

    问题场景 在使用Drools规则引擎时,有朋友会遇到这样的问题,就是在when部分判断的两个参数都是集合类型,比如两个List,此时要判断一个集合是否包含另外一个集合的内容. 拿一个具体的例子来说明, ...

  9. windows登陆suse虚拟机

    vmware我还是比较偏向7.1.4版本,其他版本装在win7上似乎有点问题. windows平台下,使用vmware + opensuse的网络配置过程如下: 装完vm后,会在本地连接新创建两个新连 ...

  10. MMM 数位dp学习记

    数位dp学习记 by scmmm 开始日期 2019/7/17 前言 状压dp感觉很好理解(本质接近于爆搜但是又有广搜的感觉),综合了dp的高效性(至少比dfs,bfs优),又能解决普通dp难搞定的问 ...