public class ClassLoadTest {
/* 知识储备 */
/*
* 类加载器 类加载器是在类未开始时进行CLASS的加载
* 其中包括BootStrap(核心,由C++编写的2进制编码,是开启类加载器的类)JRE/lib/rt.jar
* ExtClassLoader,AppClassLoader其中Ext为App的父类 Ext主要是加载jre下的jar文件
* 其中App加载Classpath下的类
* Ext加载JRE/LIB/EXT/*.JAR
* BootStrap 加载 JRE/LIB/rt.jar
*/
/*
* 类加载器的原理,还有类加载器的树形结构
*
* 委托加载机制,调用子类时找父加载器app子层要找但是不找而是先找父类加载器, 没有父类,开始找自己有么,没有加载成功将下放在下级
*/
// 模板方法设计模式,总体流程在父类中规定好,在细节上留一个抽象方法
// ClassLoader classLoader = new ClassLoader()
/*
* 一下为类加载器的测试方法 1.测试类加载器名称
*/
public static void main(String[] args) {
// 输出ClassLoadTest类的类加载器名称
// System.out.println(ClassLoadTest.class.getClassLoader().getClass()
// .getName());
//获取系统类的类加载器
// System.out.println(System.class.getClassLoader());
/* 将此类打包成JAR包放入到jre/ext的目录下,此类在运行时就将在EXT目录先进行加载,app加载器将不
* 再加载此类。
* 得到结论(委托机制,统一管理):
* 从最低层发出请求,推到最顶层(开始找,没有找到就向下级找)
* BootStrap --> Ext --> App (父-->子)
* 请求流向(但并没有开始找) App --> Ext --> Boot (开始查找,找到后进行加载没有继续向下) --> Ext -- App
* */
ClassLoader classLoader = ClassLoadTest.class.getClassLoader();
while(classLoader != null){
System.out.println(classLoader.getClass().getName());
classLoader = classLoader.getParent();
}
System.out.println(classLoader);
System.out.println(new ForClassLoad());
}
}