有三个层次的类的加载器
Bootstrap ClassLoader(引导类加载器):最底层的类加载器。是jvm自带的类加载库,负责java平台的核心库。比如String类等等这些核心类,都由Bootstrap ClassLoader负责加载。而且无法被我们直接获取到。
Extension ClassLoader(扩展类加载器)::负责jre/lib/ext目录下的jar包或 – D java.ext.dirs 指定目录下的jar包装入工作库,意思不大,就是负责加载放在指定文件夹下面的jar文件的加载器。
System ClassLoader(系统类加载器):负责java –classpath 或 –D java.class.path所指的目录下的类与jar包装入工 作 ,是最常用的加载器。自己写的代码都是由系统类加载器负责加载。
三者是一个上下继承的关系。
代码演示:
自定义Person类:
public class Person{
private String name;
private int age;
public void eat(){
System.out.println("吃");
}
}
获取Person类加载器:
public class Demo{
public static void main(String args[]){
Person person1 = new Person();
//获取Person类的加载器,即System加载器
ClassLoader classLoader1 = person1.getClass.getClassLoader();
//打印Person类加载器
System.out.println(classLoader1);
//获取Person类加载器的父加载器,即Extension加载器
ClassLoader classLoader2 = classLoader1.getParent();
//打印获取Person类加载器的父加载器
System.out.println(classLoader2);
//获取Bootstrap加载器
ClassLoader classLoader3 = classLoader2.getParent();
System.out.println(classLoader3);
//获取Bootstrap加载器
ClassLoader classLoader = String.class.getClassLoader();
System.out.println(classLoader);
}
}
执行结果:
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@1d44bcfa
null
null
出现null的原因是Bootstrap加载器无法被我们获取。