几个常见的ClassLoader:
bootstrap class loader:
最早启动的class loader,一般使用C语言,汇编语言,或是c++写的,用操作系统本地语言写的。这个class loader你动不了,也没有名字,打印出来是空值。
1,负责先把其他的class loader load进来,然后其他class loader再load其他class
2,load jre最核心的类,最核心的rt.jar拿出来把里边的class load进来。
extension class loader:
扩展,负责JDK的一些扩展类,扩展类在jre/bin/ext包里。
application class loader:
load我们自己定义的class。
还有很多其他的class loader:
SecureClassLoader安全的classloader,抽象类。
java.net的URLClassLoader继承自SecureClassLoader,会帮我们检查安全性,load从网上下载的类,如applet等。
我们也可以自己写自己的classloader,检查他的安全性,如检查名字。
代码:
public class TestJDKClassLoader { public static void main(String[] args) { //最核心的classloader,管理着最核心的类。打印不出来名字 System.out.println(String.class.getClassLoader()); //null //拿到自己定义的类的classloader--->AppClassLoader System.out.println(TestJDKClassLoader.class.getClassLoader().getClass().getName()); //拿到系统的classloader,就是--->AppClassLoader System.out.println(ClassLoader.getSystemClassLoader().getClass().getName()); } }
运行结果:
null sun.misc.Launcher$AppClassLoader sun.misc.Launcher$AppClassLoader
ClassLoader之间的层次关系:
这里说的是对象和对象的关系,不是类之间的关系,不是继承。如app class loader有一个引用,叫parent,指向他的上一层的class loader。用ClassLoader的getParent()方法可以做到。
ClassLoader c = TestJDKClassLoader.class.getClassLoader(); while(c!=null){ System.out.println(c.getClass().getName()); c = c.getParent(); }
输出:
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$ExtClassLoader
欢迎关注个人公众号一起交流学习: