类的委托加载机制

来源:互联网 发布:淘宝店铺能叫旗舰店吗 编辑:程序博客网 时间:2024/05/18 00:06

      类的委托加载机制


        java程序运行的时候先启动java虚拟机再把编译生成的class字节码文件加载入java虚拟机里面运行,加载class字节码的就叫做Class Loader翻译过来叫做类的加载器。

       java虚拟机中可以安装多个类的加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类有BootStrap(根类加载器),ExtClassLoader(扩展类加载器),AppClassLoader(应用加载器),需要注意的是

       1.类加载器也是java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类这个就是BootStrap。

       2.java虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时需要为其指定一个父级类装载器对象或者是默认采用系统类加载器为其父类加载器。

一、根类加载器(BootStrap)

该加载器没有父类加载器,它负责加载虚拟机的核心类库如java.lang.*等根类加载器的实现依赖于底层操作系统属于虚拟机实现的一部分它并没有继承java.lang.ClassLoader类而是使用C++写的。

二、扩展类加载器(ExtClassLoader)

        它的父加载器为根类加载器,它从java.ext.dirs系统属性指定的目录中加载类库,或者从JDK的安装目录的jre\lib\ext子目录(扩展目录)下加载类库,如果把用户创建的jar文件放在这个目录下面,也会自动由扩展类加载器进行加载,需要特别注意的是扩展类加载器是纯java类,是java.lang.ClassLoader类的子类。

三、应用类加载器(AppClassLoader)

        它的父加载器是扩展类加载器,它从环境变量classpath或者系统属性java.class.path所指定的目录中加载类他是用户自定义的类加载器的默认父加载器。需要特别注意的是应用类加载器是java类是java.lang.ClassLoader类的子类。

下面我们以某一java类来看其加载器

<span style="font-size:14px;"><span style="font-size:14px;">public class HeiMaTest {public static void main(String[] args) throws Exception{ClassLoader cl = HeiMaTest.class.getClassLoader();System.out.println(cl);System.out.println(cl.getParent());System.out.println(cl.getParent().getParent());}}</span></span>
运行结果截图



        需要注意的是上面提到的父类加载器概念并不是指类的继承关系,子加载器不一定继承父加载器(其实是组合的关系)

四、用户自定义加载器

        除了以上虚拟机自带的类的加载器以外,用户还可以定制自己的类加载器,java提供了抽象类java.lang.ClassLoader所有用户自定义的类的加载器都应该继承ClassLoader。

五、类的委托加载机制

        从JDK1,2版本起类的加载过程使用父类委托加载,这种机制可以更好的保护java平台的安全。

        每个ClassLoader本身只能分别加载特定位置和目录中的类,但他们可以委托其他的类装载器去加载类,这就是类加载器的委托模式。类装载器一级级委托到BootStrap类加载器,当BootStrap无法加载当前所要加载的类时,然后才一级级回退到子孙类装载器进行真正的加载。当回退到最初的类装载器时,如果它自己不能完成类的装载,那就应报告ClassNotFoundException异常。




0 0
原创粉丝点击