Java进阶之类加载器

    当JVM启动时,会形成由三个类加载器组成的初始类加载器层次结构,引导类加载器(bootstrap  classloader),扩展类加载器(extension  classloader),应用类加载器(system classloader)。三者的关系:bootstrap classloader是extension classloader的parent,extension classloader是system classloader的parent。在加载器中有一条机制,全盘委托机制,这个机制保证类只会加载一次而且不会重复加载,今天就详细介绍一下全盘委托机制,在介绍之前,让我们先对三个类加载器简单了解一下。

bootstrap classloader

    引导类加载器负责加载Java的核心类,加载jre/lib/rt.jar 路径下的类包,它是最原始的类加载器,并不是由Java代码编写的,而是由原生代码(native code)编写.它实际上不是 java.lang.ClassLoader的子类。

extension classloader

    它负责加载JRE的扩展目录 (JAVA_HOME/jre/lib/ext或者由java.ext.dirs系统属性指定的)中JAR的类包。这为引入除Java核心类以外的新功能提供了一个标准机制。因为默认的扩展目录对所有从同一个JRE中启动的JVM都是通用的,所以放入这个目录的 JAR类包对所有的JVM和system classloader都是可见的。在这个实例上调用方法getParent()总是返回空值null,因为引导加载器bootstrap classloader不是一个真正的ClassLoader实例。

system classloader

    它负责在JVM被启 动时,加载来自在命令java中的-classpath或者java.class.path系统属性或者 CLASSPATH操作系统属性所指定的JAR类包和类路径。总能通过静态方法ClassLoader.getSystemClassLoader()找到该类加载器。如果没有特别指定,则用户自定义的任何类加载器都将该类加载器作为它的父加载器。我们写的Java类,一般都是它加载的,除非你自己制定个人的类加载器。

    三个类加载器的层次关系可以简单这样看:

引导类加载器: JAVA_HOME/jre/lib/rt.jar
     |
扩展类加载器: JAVA_HOME/jre/lib/ext/*.jar
     |
应用类加载器: 加载类路径下的所有的class.

    全盘委托机制

    classloader 加载类用的是全盘负责委托机制。所谓全盘负责,即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有 Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入;委托机制则是先让parent(父)类加载器 (而不是super,它与parent classloader类不是继承关系)寻找,只有在parent找不到的时候才从自己的类路径中去寻找,比如现在有一个类:
 class A{
      String s;
 }
    由应用类加载器得到A.class  String.class,委托给扩展类加载器,扩展类加载器又委托给引导类加载器.引导类加载器加载String.class.将其他的类的class向下给扩展类加载器.扩展类加载器没有找到.向下给应用类加载器,将A.class 加载.
    此外类加载还采用了cache机制,也就是如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么我们修改了Class但是必须重新启动JVM才能生效的原因.

类加载器的顺序

    首先是bootstrap classloader,然后是extension classloader,最后才是system classloader。 大家会发现加载的Class越是重要的越在靠前面。这样做的原因是出于安 全性的考虑,试想如果system classloader“亲自”加载了一个具有破坏性的 “java.lang.System”类的后果吧。这种委托机制保证了用户即使具有一个这样的类,也把它加入到了类路径中,但是它永远不会被载入,因为这个类总是由bootstrap classloader来加载的。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值