/**
* Java虚拟机中可以安装多个类加载器,
* 系统默认三个主要类加载器,
* 每个类负责加载特定位置的类:
* BootStrap,ExtClassLoader,AppClassLoader
* 类加载器也是Java类,
* 因为其他是java类的类加载器本身也要被类加载器加载,
* 显然必须有第一个类加载器不是不是java类,
* 这正是BootStrap。
*
* BootStrap 加载的是JRE/lib/rt.jar里面的类
ExtClassLoader JRE/lib/ext/*.jar
AppClassLoader CLASSPATH指定的所有jar或目录
*
*
*
* 在两种情况下运行这段代码:
* ClassLoader loader = ClassLoaderTest.class.getClassLoader();
* while(loader != null){
System.out.println(loader.getClass().getName());
loader = loader.getParent();
}
System.out.println(loader);
1.直接在运行main方法,然后打印:
* 下面是打印的结果:
* sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
null
从这里可以看出,AppClassLoader的父类是ExtClassLoader,ExtClassLoader类的父类为null,那么是由BootStrap生产的
* 2.将这个工程打成jar包,放到D:\Java\jdk1.6.0_10\jre\lib\ext
* 下面,取名为mytest.jar,然后运行的结果为
sun.misc.Launcher$ExtClassLoader
null
从这里可以看出,ExtClassLoader加载的是JRE/lib/ext/*.jar里面的类
这里犯得错误:
一:MyEclipse下面的JRE环境不是自己电脑里面所装的环境
所以经过很过次试验之后会发现运行结果还是和没有导入时是一样的
改正;run as Configration 把里面的jre环境改掉,改成自己电脑里面所装得
然后再运行,结果就出来了
每个ClassLoader本身只能分别加载特定位置和目录中的类,
但它们可以委托其他的类装载器去加载类,这就是类加载器的委托模式。
类装载器一级级委托到BootStrap类加载器,
当BootStrap无法加载当前所要加载的类时,
然后才一级级回退到子孙类装载器去进行真正的加载。
当回退到最初的类装载器时,如果它自己也不能完成类的装载,那就应报告ClassNotFoundException异常。
每个类加载器加载类时,又先委托给其上级类加载器。
当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,
不是再去找发起者类加载器的儿子,因为没有getChild方法,
即使有,那有多个儿子,找哪一个呢?
对着类加载器的层次结构图和委托加载原理,
解释先前将ClassLoaderTest输出成jre/lib/ext目录下的itcast.jar包中后,
运行结果为ExtClassLoader的原因。
*
*/
public class ClassLoaderTest {
public static void main(String[] args) {
ClassLoader loader = ClassLoaderTest.class.getClassLoader();
String name = loader.getClass().getName();
System.out.println(name);//sun.misc.Launcher$AppClassLoader
ClassLoader loader2 = System.class.getClassLoader();
//String name2 = loader2.getClass().getName();//nullpointerException,说明这个类是有BootStartup加载的
//System.out.println(name2);//sun.misc.Launcher$AppClassLoader
while(loader != null){
System.out.println(loader.getClass().getName());
loader = loader.getParent();//得到加载器的父类
}
System.out.println(loader);
}
}
类加载的原理
最新推荐文章于 2021-03-19 01:22:43 发布