23-类加载器命名空间总结与扩展类加载器要点分析

类加载器命名空间总结与扩展类加载器要点分析

类加载器的双亲委托模型的好处:

  • ​ 可以确保Java核心库的类型安全:所有Java应用都至少会引用java.lang.Object类,也就是说在运行期,java.lang.Object这个类会被加载到Java虚拟机中;如果这个加载过程是由Java应用自己的类加载器所完成的,那么很有可能就会在JVM中存在多个版本的java.lang.Object类,而且这些类之间还是不兼容的,互相不可见的(正式命名空间发挥着作用)。

​ 借助于双亲委托机制,Java核心类库中的类的加载工作都是由根类加载器来统一完成,从而保证了Java应用所使用的都是同一个版本的Java核心类库,他们之间是相互兼容的。

  • ​ 可以确保Java核心类库所提供的类是不会被自定义的类所取代。
  • ​ 不同的类加载器可以为相同名称(binary name)的类创建额外的命名空间。相同名称的类可以并存在Java虚拟机中,只需要用不同的类加载器加载他们即可。不同类加载器所加载的类之间是不兼容的,这就相当于在Java虚拟机内部创建了一个又一个相互隔离的Java类空间,这类加载在很多框架中都得到了实际应用。

扩展类加载器:

public class MyTest22 {
    static {
        System.out.println("MyTest22 initializer");
    }
    public static void main(String[] args) throws Exception {
        System.out.println(MyTest22.class.getClassLoader());
        System.out.println(MyTest21.class.getClassLoader());
    }
}
运行结果:
      MyTest22 initializer
      sun.misc.Launcher$AppClassLoader@18b4aac2
      sun.misc.Launcher$AppClassLoader@18b4aac2

可以看到:最终运行的结果,MyTest22,MyTest21都是由系统类加载器所加载的。

调整:
在这里插入图片描述
最终运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0nnvCmc-1583898832388)(G:\笔记\图片\1576161770516.png)]
不同点:
在这里插入图片描述

​ 在运行期,一个Java类是由该类的完全限定名(binary name,二进制名)和用于加载该类的定义类加载器(defining loader)所共同决定的。

​ 如果同样名字(即相同的完全限定名)的类是由两个不同的加载器所加载,那么这些类就是不同的,即便.class文件的字节码完全一样,并且从相同的位置加载亦是如此。

​ 在Oracle的Hotspot实现中,系统属性sun.boot.class.path如果修改错了,则运行会出错,提示如下错误信息:

...out\production\IdeaProject\Jvm>java -Dsun.boot.class.path=./ Jvm.MyTest23
Error occurred during initialization of VM
java/lang/NoClassDefFoundError: java/lang/Object
发布了25 篇原创文章 · 获赞 0 · 访问量 1449

猜你喜欢

转载自blog.csdn.net/qq_40574305/article/details/104793487