java 虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器,每个类负责加载特定位置的类。
BootStrap, ExtClassLoader, AppClassLoader
BootStrap ---c++ 2进制代码
ExtClassLoader -----java类
AppClassLoader-----java类
package casic.com.base.test3;
/**
* Copyright © 2018 eSunny Info. Tech Ltd. All rights reserved.
*
* @Package: casic.com.base.test3
* @author: lh
* @date: 2018年5月1日 下午7:50:26
*/
public class ClassLoaderTest {
public static void main(String[] args) {
System.out.println(ClassLoaderTest.class.getClassLoader().getClass().getName());
/**
* System 是Bootstrap 加载器加载的
*/
//System.out.println(System.class.getClassLoader().getClass().getName());
ClassLoader loader = ClassLoaderTest.class.getClassLoader();
while(loader != null) {
System.out.println(loader.getClass().getName());
loader = loader.getParent();
}
System.out.println(loader);
}
}
ClassLoaderTest 默认是AppClassLoader加载
如果把ClassLoaderTest 打成jar包放到 jdk 的jar/lib/ext包下 则有ExtClassLoader 加载
这是java加载器的加载机制。
1.首先当前线程的类加载器去加载线程中的第一个类,
2.如果类A中引用了类B,则使用加载类A的加载器去加载类B
3.还可以直接调用ClassLoader.loadClass() 方法来指定某个类加载器去加载某个类
每个类加载器加载类时,会委托给其上级类加载器,如果所有的祖宗类加载器都没有加载到类,则回到发起者类加载器,如果还没有加载到类,则抛出ClassNotFoundException,不会再去找发起者类加载器的儿子,没有getChild方法。