过去总是喜欢看,但不怎么做实验,或者是实验做了就仍了,也不记录,结果导致:看了忘,忘了看。这回重读《深入体验Java_Web开发内幕-核心基础》,恰好提到,顺便记录一下吧。
1. 简单介绍
- Bootstrap、 ExtClassLoader、 AppClassLoader是java最根正苗红的类加载器。
- 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
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
…………
分享到:
相关推荐
从上述代码中可以看出,系统的类加载器是`AppClassLoader`,它的父加载器是`ExtClassLoader`,而`ExtClassLoader`的父加载器是启动类加载器,后者无法被Java程序直接引用。此外,我们还可以看到,`Object`类是由启动...
- 扩展(Extension)类加载器:由ExtClassLoader实现,加载JRE/lib/ext目录下的jar文件或由java.ext.dirs系统变量指定的类库。 - 系统(System)类加载器:也称为应用程序类加载器,由AppClassLoader实现,加载...
Java类加载器分为三种主要类型:引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader,也称为系统类加载器)。它们共同工作,确保了Java...
1. **Bootstrap ClassLoader**: 这是由JVM内部实现的类加载器,主要用于加载核心Java类库(即所有以`java.*`开头的类)。它是用本地代码实现的,并不继承自`java.lang.ClassLoader`。 2. **Extension ClassLoader**...
Java 类加载器有三种默认使用的类加载器:Bootstrap 类加载器、Extension 类加载器和 System 类加载器(或称作 Application 类加载器)。每种类加载器都有设定好从哪里加载类。 Bootstrap 类加载器负责加载 rt.jar ...
2. **扩展类加载器(Extension ClassLoader)**:由sun.misc.Launcher$ExtClassLoader实现,加载JRE扩展目录`jre/lib/ext`下的jar文件,或者系统属性`java.ext.dirs`指定的路径。 3. **应用程序类加载器(Application ...
Java类加载器是Java虚拟机(JVM)的重要组成部分,它的主要职责是将类的字节码文件(.class文件)从文件系统、网络或内存中读取,并转换为运行时的java.lang.Class对象。这个过程是Java动态加载机制的核心,使得Java...
2. **扩展类加载器(Extension Class Loader)**:由Java编写,具体为`sun.misc.Launcher$ExtClassLoader`,它是引导类加载器的子加载器,负责加载%JAVA_HOME%\jre\lib\ext目录下的类库或java.ext.dirs系统变量指定...
1. 启动(Bootstrap)类加载器:这是最基础的类加载器,由本地代码实现,负责加载JRE目录下的`<Java_Runtime_Home>/lib`路径中的类库。 2. 扩展(Extension)类加载器:由Sun的`ExtClassLoader`实现,加载`<Java_...
这是通过调用`getSystemClassLoader()`方法实现的,该方法返回的是引导类加载器(Bootstrap ClassLoader)的子类,通常为ExtClassLoader或AppClassLoader。 ClassLoader的加载过程包括以下几个步骤: 1. 加载...
类加载的层次结构(hierarchy)从引导类加载器开始,然后是扩展类加载器(ExtClassLoader),最后是应用程序类加载器(AppClassLoader),它们之间存在父子关系,形成一个树状结构。 了解类加载机制的细节有助于...
1. 启动(Bootstrap)类加载器:这是最基础的类加载器,由本地代码实现,负责加载`<Java_Runtime_Home>/lib`目录下的核心类库。由于涉及虚拟机内部实现,开发者无法直接访问。 2. 扩展(Extension)类加载器:由`...
当我们打印类加载器的层级关系时,可以看到Test类由AppClassLoader加载,AppClassLoader的父加载器是ExtClassLoader,而ExtClassLoader的父加载器是BootStrap Loader,但由于BootStrap Loader是用C++实现且在JVM内部...
总结,Java的类加载机制是一个复杂而重要的过程,涉及到类加载器的层次结构、双亲委派模型以及类的生命周期管理。理解这些概念对于深入理解JVM的工作原理和优化Java应用程序性能至关重要。在实际开发中,开发者应...
2. **Extension Class Loader(扩展类加载器)**:该类加载器由`sun.misc.Launcher$ExtClassLoader`实现,负责加载`JAVA_HOME/jre/lib/ext`目录中的所有类库。Extension Class Loader的父加载器为Bootstrap Class ...
Java虚拟机规范定义了两类类加载器:启动类加载器(Bootstrap ClassLoader)和用户自定义类加载器(User-Defined ClassLoader)。 - **启动类加载器(Bootstrap ClassLoader)**:这是JVM自带的一个类加载器,用于加载...
在示例代码中,我们看到`OneServlet`类的加载器是`WebappClassLoader`,接着是`StandardClassLoader`,然后是`AppClassLoader`,最后是`ExtClassLoader`和`Bootstrap ClassLoader`。`getParent()`方法用于获取父类...