java 委托原则_java classloader双亲委派原则

1.1  class loader

1.1.1    加载器类型

1.1.1.1  bootstrap class loader

引导类加载器/启动类加载器,用来加载java的核心库。主要是 jre/lib目录(来源于环境变量sun.boot.class.path)。其由c++编写,本身属于虚拟机的一部分,无法在java代码中获取它的引用。

打印其启动的jar:

String[] files = System.getProperty("sun.boot.class.path").split(";");

Arrays.asList(files).forEach(System.out::println);

结果:

C:\Program Files\Java\jdk1.8.0_151\jre\lib\endorsed\rt_debug.jar (自己添加的debug时用于显示变量的rt.jar)

C:\Program Files\Java\jdk1.8.0_151\jre\lib\resources.jar

C:\Program Files\Java\jdk1.8.0_151\jre\lib\rt.jar

C:\Program Files\Java\jdk1.8.0_151\jre\lib\sunrsasign.jar

C:\Program Files\Java\jdk1.8.0_151\jre\lib\jsse.jar

C:\Program Files\Java\jdk1.8.0_151\jre\lib\jce.jar

C:\Program Files\Java\jdk1.8.0_151\jre\lib\charsets.jar

C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfr.jar

C:\Program Files\Java\jdk1.8.0_151\jre\classes

1.1.1.2  extensions class loader

扩展类加载器,用来加载java的扩展库

打印其启动的jar

String[] extFiles = System.getProperty("java.ext.dirs").split(";");

Arrays.asList(extFiles).forEach(System.out::println);

结果:

C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext

C:\Windows\Sun\Java\lib\ext

1.1.1.3  system class loader/application class loader

系统类加载器

打印其启动的jar

String[] appFiles = System.getProperty("java.class.path").split(";");

Arrays.asList(appFiles).forEach(System.out::println);

结果:

E:\work_space\Study\target\test-classes

E:\work_space\Study\target\classes

D:\mvn_repositroy\org\slf4j\slf4j-api\1.7.22\slf4j-api-1.7.22.jar

D:\mvn_repositroy\ch\qos\logback\logback-core\1.1.8\logback-core-1.1.8.jar

D:\mvn_repositroy\ch\qos\logback\logback-classic\1.1.8\logback-classic-1.1.8.jar

1.1.1.4  自定义加载器

1.1.2    类加载器之间的关系

除了引导类加载器,所有的类加载器都有一个父类加载器。

默认情况下,开发人员自己编写的类加载器父类加载器是系统类加载器(除非显示指定了父类加载器)。可以通过getParent()获得(除了父类为引导类加载器)。示意图如下:

b792315c3f64692ade2587c242a0db35.png

91bcf7e652d43f7bb1fdccbd860e8e78.png

1.1.3    双亲委托

java虚拟机是如何判定两个class是相同的:不仅要看类的全名是否相同,还要看加载器是否相同。

比如Hello.class是编译后的字节码,如果不自定义加载器,那么只会加载一次这个class,但是如果自定义了两个同级classloader,那么则可以加载两个class。

双亲委托主要概念见下图,设计思想主要是避免同一个类被不同的加载器加载,导致额外问题。

加载类之前先看看父类有没有,没有的话看看父类能不能加载,父类有的直接复用,父类能加载的自己绝不加载。(自定义类加载器除外,某些时刻属于定制加功能)

1.1.3.1  示意图

4283b15a17c0e601129b613e04f858a4.png

20440d53b5db421ac914f2a9263a979f.png

ed8479a6a001c8a2864c0a69a0c2c385.png

1.1.4    参考资源

备注:图都是摘录的,理论上来源于上面三个链接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值