java类加载器-Bootstrap、 ExtClassLoader、 AppClassLoader的关系
2017-10-11 15:26
791 查看
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. 代码实验
Java代码
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中保存一份,并且在程序运行中无法改变其搜索路径。如果想在运行时从其他搜索路径加载类,就要产生新的类加载器。
参看文章:
http://lavasoft.blog.51cto.com/62575/184547
http://sunfish.iteye.com/blog/1472462
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. 代码实验
Java代码
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中保存一份,并且在程序运行中无法改变其搜索路径。如果想在运行时从其他搜索路径加载类,就要产生新的类加载器。
参看文章:
http://lavasoft.blog.51cto.com/62575/184547
http://sunfish.iteye.com/blog/1472462
相关文章推荐
- java类加载器 Bootstrap、ExtClassLoader、AppClassLoader的关系
- java类加载器-Bootstrap、 ExtClassLoader、 AppClassLoader的关系
- Java类加载器-Bootstrap、 ExtClassLoader、 AppClassLoader
- 分析AppClassLoader,ExtClassLoader 和URLClassLoader 的关系
- 分析AppClassLoader,ExtClassLoader 和URLClassLoader 的关系
- 关于ExtClassLoader 和AppClassLoader 的位置
- 分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码
- 分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码
- 类路径分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码
- 【Android Tip 01】ClassLoader、Android Framework ClassLoader、App ClassLoader
- Android中ClassLoader和java中ClassLoader有什么关系和不同
- JVM类加载器的urlclassloader和appclassloader
- 一个疑问,模拟bootstrap获取webappclassloader的class却不成功,无语了。
- at org.apache.catalina.loader.WebappClassLoader.loadClass问题处理
- Error loading WebappClassLoader
- 由osgi引出的classLoader的大总结(整理理解ClassLoader)
- java的classLoader分析与jettty的WebAppClassLoader
- 【原创】Error loading WebappClassLoader
- Tomcat的WebappClassLoader(web应用类加载器)详解(一)
- at org.apache.catalina.loader.WebappClassLoader.loadClass