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. jmeter性能测试前及测试后

    压测前:           1.压力测试两种场景:                    1)单场景,压测单个接口. 2)混合场景,多个接口关联压测. 2.压测时间:                ...

  2. 项目总结之echarts 使用

    项目上需要使用echarts,对于一个新手前端来说,差点要爆炸了,自身前端基础就不好,echarts就更是不熟了,硬生生的逼着要一周做完一个系统.这算是个小总结吧,以后万一用的上捏. 渐变使用 项目中 ...

  3. JavaScript 基础知识 变量与数据类型

    一.区分大小写 JS中一切(变量/函数名/操作符)都是严格区分大小写的 二.标识符 变量.函数.属性的名字以及函数的参数 命名规则:1.第一个字符可以是字母.下划线.美元符号$ 2.其他的字符可以是字 ...

  4. python中的 == 和 is 的区别

    == 比较的是两边的值 is 比较的是两边的内存地址  通过 id()获取内存地址 小数据池:我们使用过的值存储在小数据池中,供其他数据使用. 小数据池仅限于 数字 和 字符串: 数字的小数池范围  ...

  5. curl请求的get.post.put.delete对接其他系统接口方法

    class HttpCurl{ //控客云平台的appid private $appId = xxxxxx; //控客云平台的appkey private $appKey = 'xxxxxxxxxxx ...

  6. TCP/IP协议、三次握手、四次挥手

    1.什么是TCP/IP协议 TCP/IP 是一类协议系统,它是用于网络通信的一套协议集合. 传统上来说 TCP/IP 被认为是一个四层协议 1) 网络接口层: 主要是指物理层次的一些接口,比如电缆等. ...

  7. C#语言注释详解

    C#语言注释有三种形式 C#语言注释有三种形式 第一种是多行注释: /*  */ 例如: /* int a=1; int b=2; int c=3; */// 第二种是单行注释: 例如: // int ...

  8. 一台服务器通过nginx配置多个域名(80端口)

    1. 问题描述 多个域名对应一个服务器,为了避免域名后增加端口号,两个域名都需要占用80端口号,使用nginx来进行配置. 2. 解决方案 目前项目中,线上正在使用(100%可用)多域名对应一个服务器 ...

  9. MySQL Explain查看执行计划

    这篇博客写的还是蛮全的 http://www.cnblogs.com/songwenjie/p/9409852.html 在执行SQL的时候,经常有些SQL未正确使用到索引,导致程序变慢,通过使用ex ...

  10. Python 含小数的十、二进制相互转换

    ''' 二进制->十进制:bTod 整数部分:a乘以2的n次方(n:a后面的整数位数) 小数部分:a乘以2的-n次方(n:a是小数点后几位) 十进制->二进制dTob 整数部分:短除法(除 ...