Java中类的加载器
类的加载器时机分别有以下几种情况
- 创建类的实例。
- 类的静态变量,或者为静态变量赋值。
- 类的静态方法。
- 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象。
- 初始化某个类的子类。
- 直接使用java.exe命令来运行某个主类。
public static void main(String[] args) {
/*引导类加载器Bootstrap:是C++语言编写,负责加载JDK核心类库,核心类库位置\jdk\jre\lib\下的jar包。
由于引导类加载器器在JVM内部,开发人员是不能直接操作的。
*/
ClassLoader classLoader = String.class.getClassLoader();
System.out.println(classLoader);//null
/*扩展类加载器ExtClassLoader:Java语言编写的类加载器,负责加载JDK扩展类库,类库位置\jdk\lib\ext\下的jar包。*/
ClassLoader loader = DNSNameService.class.getClassLoader();
System.out.println(loader);//sun.misc.Launcher$ExtClassLoader@45ee12a7
/*应用类加载器AppClassLoader:Java语言编写的类加载器,负责加载我们定义的类和第三方jar包中的类。*/
ClassLoader classLoader1 = classloader01.class.getClassLoader();
System.out.println(classLoader1);//sun.misc.Launcher$AppClassLoader@18b4aac2
/*ClassLoader类定义了方法 ClassLoader getParent():返回父类加载器。
AppClassLoader的父类加载器是ExtClassLoader,ExtClassLoader的父类加载器是Bootstrap。但他们之间没有继承关系* */
/*谁用谁加载:当A类中使用了B类,那么负责加载A类的加载器要去加载B类。
双亲委派机制:当AppClassLoader收到一个加载类的请求时,会先让他的父类加载器ExtClassLoader尝试加载,
ExtClassLoader也会让他的父类加载器Bootstrap尝试加载,如果Bootstrap能加载,就加载该类。
如果Bootstrap不能加载,则ExtClassLoader会进行加载,如果也不能加载,AppClassLoader会进行加载。*/
}