为什么 Java 中有三种基础的类加载器?
引言
Java 中有三种基础的类加载器 BootStrap, Extension and System
他们都有一个职能,就是从不同的包中加载类。
但是一个类加载器完全可以加载所有的类,为什么要有 3 种基础的类型的类加载器呢?
最佳答案
Java 中有三种基础的类加载器主要为了安全。
1.2 版本的 JVM 中,只有一个类加载器,就是现在的“Bootstrap”类加载器。
类加载器加载类的方式是,加载器先调用父加载器对类进行加载,如果父加载器找不到该类,此加载器才会去加载该类。
最关键的是, 除非是同一个类加载器加载的类 ,否则 JVM 不会保证包访问级别(如果不指明 private/public 或 protected,则方法和属性具有包访问级别)。
因此,假如用户调用他编写的 java.lang.MyClass 类。理论上该类可以访问和改变 java.lang 包下其他类的默认访问修饰符的属性和方法的能力。Java 语言本身并没有阻止这种行为。但是 JVM 则会阻止这种行为,因为 java 核心类库的 java.lang 包下的类是由 bootstrap 类加载器加载的。不是同一个类加载器加载的类等于不具有包级别的访问权限。
类加载器中的其他安全特性也会阻止这种类型侵入。
所以为什么有三种基础的类加载器?是因为他们代表三种不同的信任级别。最可信的级别是 java 核心 API 类。然后是安装的拓展类,最后才是在类路径中的类(属于你本机的类)。
其他解释 1
类加载主要的应用场景是在应用服务器上。
如果你想启动 Tomcat。这至少需要一个类加载器来运行 Tomcat 自己。
然后你想在 Tomcat 容器中部署项目。因此 Tomcat 需要加载和分析甚至在 Tomcat 启动前都不存在的类。
然后你又想在 Tomcat 中部署另外一个应用。 第二个应用可能也会用到第一个应用使用的库,但是版本不同。
因此你就需要每个应都有相互隔离的类加载器,否则第二个应用的类可能会覆盖第一个应用之前加载的类,从而造成一些意想不到的后果。
然后你想停掉某个 web 应用。该应用的类加载器应该会被销毁,垃圾也随之被回收,这样可以避免内存泄露。
或许类加载器还有其他用途,但这是我印象中最常见的用法。
其他解释 2
多种类加载器待办可以同时加载多个应用程序(一个加载服务,另外的加载器用来服务器内部的部署)。
每种加载器都有对应的层级来加载某些特定的类,来保证他们之间的安全性。
总结
当你工作一段时间以后,差不多 3 年左右的时间,你就需要花点时间思考下,给自己一个未来的规划,想想自己对什么是真正的感兴趣,什么方向才真正的适合自己,进而给自己定位,然后朝着自己定位的方向去学习,去努力,只有这样才能让你在职业生涯的中期不至于迷茫,不至于觉得心里没底。
我也是一名从事了 8 年的高级架构师,花了近两个月整理了一份较适合当下学习的干货(视频资料),以及我这 8 年的工作经验,分享给每一位想学 Java 的小伙伴,这里是 Java 学习者聚集地,欢迎进阶中的小伙伴。
最后以上这些技术点有资料吗?当然有!
资料获取方式:可以+v:xiaoyanya_1 或者点击这里免费领取希望能对铁子们有帮助,一起在 Java 的路上一起努力一起学习一起进步
评论