继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

为什么Java中有三种基础的类加载器?

慕村9548890
关注TA
已关注
手记 1102
粉丝 227
获赞 987

引言

Java中有三种基础的类加载器 BootStrap, Extension and System

他们都有一个职能,就是从不同的包中加载类。

但是一个类加载器完全可以加载所有的类,为什么要有3种基础的类型的类加载器呢?

最佳答案

Java中有三种基础的类加载器主要为了安全。

1.2版本的JVM中,只有一个类加载器,就是现在的“Bootstrap”类加载器。

类加载器加载类的方式是,加载器先调用父加载器对类进行加载,如果父加载器找不到该类,此加载器才会去加载该类。

最关键的是, 除非是同一个类加载器加载的类 ,否则JVM不会保证包访问级别(如果不指明private/public或protected,则方法和属性具有包访问级别)。

webp

因此,假如用户调用他编写的java.lang.MyClass类。理论上该类可以访问和改变java.lang包下其他类的默认访问修饰符的属性和方法的能力。Java语言本身并没有阻止这种行为。但是JVM则会阻止这种行为,因为java核心类库的java.lang包下的类是由bootstrap类加载器加载的。不是同一个类加载器加载的类等于不具有包级别的访问权限。

类加载器中的其他安全特性也会阻止这种类型侵入。

所以为什么有三种基础的类加载器?是因为他们代表三种不同的信任级别。最可信的级别是java核心API类。然后是安装的拓展类,最后才是在类路径中的类(属于你本机的类)。

其他解释1

类加载主要的应用场景是在应用服务器上。

如果你想启动Tomcat。这至少需要一个类加载器来运行Tomcat自己。

然后你想在Tomcat容器中部署项目。因此Tomcat需要加载和分析甚至在Tomcat启动前都不存在的类。

然后你又想在Tomcat中部署另外一个应用。 第二个应用可能也会用到第一个应用使用的库,但是版本不同。

因此你就需要每个应都有相互隔离的类加载器,否则第二个应用的类可能会覆盖第一个应用之前加载的类,从而造成一些意想不到的后果。

然后你想停掉某个web应用。该应用的类加载器应该会被销毁,垃圾也随之被回收,这样可以避免内存泄露。

或许类加载器还有其他用途,但这是我印象中最常见的用法。

其他解释2

多种类加载器待办可以同时加载多个应用程序(一个加载服务,另外的加载器用来服务器内部的部署)。

每种加载器都有对应的层级来加载某些特定的类,来保证他们之间的安全性。

总结

当你工作一段时间以后,差不多3 年左右的时间,你就需要花点时间思考下,给自己一个未来的规划,想想自己对什么是真正的感兴趣,什么方向才真正的适合自己,进而给自己定位,然后朝着自己定位的方向去学习,去努力,只有这样才能让你在职业生涯的中期不至于迷茫,不至于觉得心里没底。



作者:Java猫
链接:https://www.jianshu.com/p/8c4e968785d5


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP