Java中ClassLoader不止一个,最核心的是bootstrap classlaoder,这个classloader是native language实现的,负责加载jdk的一些核心类,这些类加载到堆里面的永久区(permanent space),也负责加载其他的classloader,我们不能通过反射拿到这个classloader的名字的,其他都可以。
还有extension classloader,它负责加载jre/lib/ext下面的jar包中的类。
用户自定义的类是通过application classloader加载的,可以直接通过ClassLoader.getSystemClassLoader()拿到本类的classloader。
通过查看java api可以发现,所有的classloader都继承了java.lang.ClassLoader这个抽象类,如它的直接子类SecureClassLoader,以及SecureClassLoader的子类URLClassLoader等。
通过下面的小程序测试不同的classloader。
public class TestJDKClassLoader {
public static void main(String[] args) {
//jdk的一些核心类是被bootstrap classloader加载的,不能拿到它的名字
System.out.println(String.class.getClassLoader());
//这个是jre/lib/ext/下的包中一个类,它的classloader名字叫ExtClassLoader
System.out.println(sun.net.spi.nameservice.dns.DNSNameService.class
.getClassLoader().getClass().getName());
//自定义的类的classloader为AppClassLoader
System.out.println(TestJDKClassLoader.class.getClassLoader().getClass()
.getName());
}
}运行结果如下:
null
sun.misc.Launcher$ExtClassLoader
sun.misc.Launcher$AppClassLoader
本文详细介绍了Java中ClassLoader的概念及其分类,包括bootstrap classloader、extension classloader和application classloader,并通过一个小程序展示了如何测试不同类加载器的加载过程。
33万+

被折叠的 条评论
为什么被折叠?



