类加载器
作用
类加载器的作用是将字节码文件加载进内存,让静态数据在方法区中变成结构数据,同时在堆中形成这个类的class对象。
分类
- 系统加载器
- 扩展类加载器
- 根加载器
内置加载器主要是负责加载我们自定义的类,而系统加载器主要是负责加载jdk内置的类,如String类等。
双亲委派机制
在内加载的过程中,会先使用系统加载器,在使用扩展类加载器,最后才使用根加载器。如果后者能加载前者已经加载了的类,就会重新加载并进行覆盖。这就是双亲委托机制。所以我们在long包下自定义一个Sting类,是无法进行使用的。
public class Test02 {
public static void main(String[] args) throws ClassNotFoundException {
//获得系统加载器
ClassLoader cl = ClassLoader.getSystemClassLoader();
System.out.println(cl);
//获得系统加载器的父类扩展类加载器
ClassLoader cl2 = cl.getParent();
System.out.println(cl2);
//获得扩展类加载器的父类根加载器
ClassLoader cl3 = cl2.getParent();
System.out.println(cl3);//null 无法获取,因为根加载器是通过c/c++编写的
//测试自定义类是通过什么加载器加载的
Class cls = Class.forName("com.reflection.Test02");
System.out.println(cls.getClassLoader());
//测试jdk内置类是通过什么加载的
Class cls2 = Class.forName("java.lang.String");
System.out.println(cls2.getClassLoader());
}
}