Java中的类加载器(ClassLoader)是Java平台的一个核心组件,它负责将Java类的字节码从磁盘加载到内存中,并构造出类的对象。Java虚拟机提供了三种类加载器:Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader。每个类加载器都有其特定的加载范围和加载顺序,不同的类加载器可以互相协作来完成类的加载。
Bootstrap ClassLoader:Bootstrap ClassLoader是Java虚拟机的内置类加载器,它负责加载Java虚拟机的核心类库,如java.lang包中的类。Bootstrap ClassLoader是C++编写的,无法通过Java代码来直接引用。
Extension ClassLoader:Extension ClassLoader是Java虚拟机的扩展类加载器,它负责加载Java虚拟机的扩展类库,如javax包中的类。Extension ClassLoader是Java编写的,可以通过Java代码来直接引用。
Application ClassLoader:Application ClassLoader是Java虚拟机的应用程序类加载器,它负责加载应用程序中的类。Application ClassLoader是Java编写的,可以通过Java代码来直接引用。
下面是一个简单的示例代码,用来演示Java中的类加载器:
public class ClassLoaderDemo {
public static void main(String[] args) {
ClassLoader classLoader = ClassLoaderDemo.class.getClassLoader();
while (classLoader != null) {
System.out.println(classLoader);
classLoader = classLoader.getParent();
}
}
}
在上面的代码中,我们通过调用ClassLoaderDemo类的getClassLoader()方法获取了ClassLoaderDemo类的类加载器。然后,我们使用while循环遍历ClassLoaderDemo类的类加载器以及其父类加载器,并将其打印到控制台上。
运行上面的代码,我们可以看到如下的输出结果:
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@7852e922
在上面的输出结果中,第一行输出了Application ClassLoader的信息,第二行输出了Extension ClassLoader的信息。由此可见,ClassLoaderDemo类是由Application ClassLoader加载的,而Application ClassLoader又是由Extension ClassLoader加载的。最终,Bootstrap ClassLoader将作为顶级类加载器,并且无法通过Java代码直接引用。