java launcherbootstrap_Java类加载器-Bootstrap、 ExtClassLoader、 AppClassLoader

过去总是喜欢看,但不怎么做实验,或者是实验做了就仍了,也不记录,结果导致:看了忘,忘了看。这回重读《深入体验Java_Web开发内幕-核心基础》,恰好提到,顺便记录一下吧。

1. 简单介绍

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

ExtClassLoader和AppClassLoader分别是sun.misc.Launcher类的内部类,且都继承自URLClassLoader :

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

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

2. 代码实验

public class LoaderTest {

/**

* @param args

*/

public static void main(String[] args) {

new LoaderTest().test();

}

/**

* @param args

*/

public void test() {

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

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

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

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

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

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

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

ClassLoader grandfatherLoader = fatherLoader.getParent();

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

}

}

代码运行结果:

当前类的父加载器名称:sun.misc.Launcher$AppClassLoader

AppClassLoader的加载器是null吗:true

爷爷载器名称:sun.misc.Launcher$ExtClassLoader

当前类的父加载器名称: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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值