美文网首页
ClassLoader

ClassLoader

作者: 天探女 | 来源:发表于2020-02-29 09:06 被阅读0次

    [toc]

    ClassLoader

    ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确运行了。

    jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载。

    class 文件

    class文件是字节码格式文件,java虚拟机并不能直接识别我们平常编写的.java源文件,所以需要javac这个命令转换成.class文件。

    Java类加载流程

    java自带三个类加载器

    Bootstrap ClassLoader

    最顶层的类加载器,主要加载核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。

    可以通过启动jvm时指定-Xbootclasspath和路径来改变Bootstrap ClassLoader的加载目录。

    Extention ClassLoader

    扩展的类加载器,加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。还可以加载-D java.ext.dirs选项指定的目录。

    Appclass Loader (SystemAppClass)

    加载当前应用的classpath的所有类

    其他

    除了Java默认提供的三个ClassLoader之外,用户还可以根据需要定义自已的ClassLoader,而这些自定义的ClassLoader都必须继承自java.lang.ClassLoader类,也包括Java提供的另外二个ClassLoader(Extension ClassLoader和App ClassLoader)在内,但是Bootstrap ClassLoader不继承自ClassLoader,因为它不是一个普通的Java类,底层由C++编写,已嵌入到了JVM内核当中,当JVM启动后,Bootstrap ClassLoader也随着启动,负责加载完核心类库后,并构造Extension ClassLoader和App ClassLoader类加载器。

    即,ExtClassLoader类调用对应的getParent()方法,返回的是NULL,应为ExtClassLoader的父加载器Bootstrap ClassLoader不是一个普通的Java类

    ClassLoader 加载类原理

    原理

    ClassLoader使用的是<font style="color:red">++双亲委托模型++</font>来搜索类的,每个ClassLoader实例都有一个父类加载器的引用(不是继承的关系,是一个包含的关系),虚拟机内置的类加载器(Bootstrap ClassLoader)本身没有父类加载器,但可以用作其它ClassLoader实例的的父类加载器。当一个ClassLoader实例需要加载某个类时,它会试图亲自搜索某个类之前,先把这个任务委托给它的父类加载器,这个过程是由上至下依次检查的,首先由最顶层的类加载器Bootstrap ClassLoader试图加载,如果没加载到,则把任务转交给Extension ClassLoader试图加载,如果也没加载到,则转交给App ClassLoader 进行加载,如果它也没有加载得到的话,则返回给委托的发起者,由它到指定的文件系统或网络等URL中加载该类。如果它们都没有加载到这个类时,则抛出ClassNotFoundException异常。否则将这个找到的类生成一个类的定义,并将它加载到内存当中,最后返回这个类在内存中的Class实例对象。

    使用双亲委托模型的原因

    因为这样可以避免重复加载,当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。

    jvm判断两个class是否相同

    JVM在判定两个class是否相同时,不仅要判断两个类名是否相同,而且要判断是否由同一个类加载器实例加载的。只有两者同时满足的情况下,JVM才认为这两个class是相同的。

    比如说自定义了一个ClassLoader,并new了两个ClassLoader实例对象,此时用这两个实例对象分别加载同一个A.class文件,利用反射机制将得到.class相应的object对象,将object强转成A会出现ClassCastException异常

    相关文章

      网友评论

          本文标题:ClassLoader

          本文链接:https://www.haomeiwen.com/subject/wnlfqftx.html