`
cfan_haifeng
  • 浏览: 121888 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

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

    博客分类:
  • jvm
阅读更多

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

 

 

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. 代码实验

 

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

…………

分享到:
评论

相关推荐

    java类加载器

    从上述代码中可以看出,系统的类加载器是`AppClassLoader`,它的父加载器是`ExtClassLoader`,而`ExtClassLoader`的父加载器是启动类加载器,后者无法被Java程序直接引用。此外,我们还可以看到,`Object`类是由启动...

    Java类加载器原理

    - 扩展(Extension)类加载器:由ExtClassLoader实现,加载JRE/lib/ext目录下的jar文件或由java.ext.dirs系统变量指定的类库。 - 系统(System)类加载器:也称为应用程序类加载器,由AppClassLoader实现,加载...

    Java类加载器(ClassLoader)1

    Java类加载器分为三种主要类型:引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader,也称为系统类加载器)。它们共同工作,确保了Java...

    类加载器文件

    1. **Bootstrap ClassLoader**: 这是由JVM内部实现的类加载器,主要用于加载核心Java类库(即所有以`java.*`开头的类)。它是用本地代码实现的,并不继承自`java.lang.ClassLoader`。 2. **Extension ClassLoader**...

    JAVA的类加载器的工作原理.pdf

    Java 类加载器有三种默认使用的类加载器:Bootstrap 类加载器、Extension 类加载器和 System 类加载器(或称作 Application 类加载器)。每种类加载器都有设定好从哪里加载类。 Bootstrap 类加载器负责加载 rt.jar ...

    java应用程序类加载器,ClassLoader for java Application

    2. **扩展类加载器(Extension ClassLoader)**:由sun.misc.Launcher$ExtClassLoader实现,加载JRE扩展目录`jre/lib/ext`下的jar文件,或者系统属性`java.ext.dirs`指定的路径。 3. **应用程序类加载器(Application ...

    Java类加载器的详解

    Java类加载器是Java虚拟机(JVM)的重要组成部分,它的主要职责是将类的字节码文件(.class文件)从文件系统、网络或内存中读取,并转换为运行时的java.lang.Class对象。这个过程是Java动态加载机制的核心,使得Java...

    Java类加载器学习总结.pdf

    2. **扩展类加载器(Extension Class Loader)**:由Java编写,具体为`sun.misc.Launcher$ExtClassLoader`,它是引导类加载器的子加载器,负责加载%JAVA_HOME%\jre\lib\ext目录下的类库或java.ext.dirs系统变量指定...

    Java类加载原理解析

    1. 启动(Bootstrap)类加载器:这是最基础的类加载器,由本地代码实现,负责加载JRE目录下的`<Java_Runtime_Home>/lib`路径中的类库。 2. 扩展(Extension)类加载器:由Sun的`ExtClassLoader`实现,加载`<Java_...

    深入java虚拟机(七)深入源码看java类加载器ClassLoader 1

    这是通过调用`getSystemClassLoader()`方法实现的,该方法返回的是引导类加载器(Bootstrap ClassLoader)的子类,通常为ExtClassLoader或AppClassLoader。 ClassLoader的加载过程包括以下几个步骤: 1. 加载...

    JAVA 类加载机制分析

    类加载的层次结构(hierarchy)从引导类加载器开始,然后是扩展类加载器(ExtClassLoader),最后是应用程序类加载器(AppClassLoader),它们之间存在父子关系,形成一个树状结构。 了解类加载机制的细节有助于...

    Java类加载原理解析文档

    1. 启动(Bootstrap)类加载器:这是最基础的类加载器,由本地代码实现,负责加载`<Java_Runtime_Home>/lib`目录下的核心类库。由于涉及虚拟机内部实现,开发者无法直接访问。 2. 扩展(Extension)类加载器:由`...

    Java虚拟机class文件原理

    当我们打印类加载器的层级关系时,可以看到Test类由AppClassLoader加载,AppClassLoader的父加载器是ExtClassLoader,而ExtClassLoader的父加载器是BootStrap Loader,但由于BootStrap Loader是用C++实现且在JVM内部...

    S18-ClassLoader类加载流程1

    总结,Java的类加载机制是一个复杂而重要的过程,涉及到类加载器的层次结构、双亲委派模型以及类的生命周期管理。理解这些概念对于深入理解JVM的工作原理和优化Java应用程序性能至关重要。在实际开发中,开发者应...

    java自定义类加载classloader文档,包括代码

    2. **Extension Class Loader(扩展类加载器)**:该类加载器由`sun.misc.Launcher$ExtClassLoader`实现,负责加载`JAVA_HOME/jre/lib/ext`目录中的所有类库。Extension Class Loader的父加载器为Bootstrap Class ...

    ClassLoader原理

    Java虚拟机规范定义了两类类加载器:启动类加载器(Bootstrap ClassLoader)和用户自定义类加载器(User-Defined ClassLoader)。 - **启动类加载器(Bootstrap ClassLoader)**:这是JVM自带的一个类加载器,用于加载...

    java 类加载与自定义类加载器详解

    在示例代码中,我们看到`OneServlet`类的加载器是`WebappClassLoader`,接着是`StandardClassLoader`,然后是`AppClassLoader`,最后是`ExtClassLoader`和`Bootstrap ClassLoader`。`getParent()`方法用于获取父类...

Global site tag (gtag.js) - Google Analytics