几个常见的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

 

 欢迎关注个人公众号一起交流学习: