在Java中拥有3类装入器的原因是什么

2022-09-04 19:35:38

Java 有 3 个类装入器:

  • 启动
  • 扩展和
  • 系统

他们有一个角色;从不同的包加载类。

但是为什么Java有3个不同的类装入器,而不是只有一个,因为一个类装入器可以装入所有必要的类呢?


答案 1

拥有三个基本类装入器(Bootstrap,extension,system)的原因主要是安全性。

在 JVM 1.2 版之前,只有一个缺省的类装入器,即目前称为“Bootstrap”类装入器。

类装入器加载类的方式是,每个类装入器首先调用其父级,如果该父级找不到请求的类,则当前类装入器会自己查找它。

一个关键的概念是,JVM 不会授予包访问权限(如果您没有特别提及,则方法和字段具有的访问权限,或者 ),除非请求此访问权限的类来自加载它希望访问的类的同一类装入器privatepublicprotected

因此,假设一个用户调用他的类 。从理论上讲,它可以让包访问包中的所有字段和方法,并改变它们的工作方式。语言本身并不能阻止这种情况。但是 JVM 会阻止这一点,因为所有实际类都是由引导类装入器装入的。不相同的加载程序 = 无访问权限。java.lang.MyClassjava.langjava.lang

类装入器中还内置了其他安全功能,使得执行某些类型的黑客攻击变得困难。

那么为什么是三类加载器呢?因为它们代表了三个级别的信任。最受信任的类是核心 API 类。接下来是安装的扩展,然后是出现在类路径中的类,这意味着它们是计算机的本地。

有关更详细的解释,请参阅Bill Venners的“Inside the Java Virtual Machine”。


答案 2

类装入器的主要用途是在应用程序服务器中。

例如,您希望能够启动Tomcat。这已经需要至少一个类装入器来运行tomcat本身。

然后,您希望能够将应用程序部署到Tomcat中。因此,Tomcat 本身需要加载一个分析应用程序的类,这在 Tomcat 启动时甚至不存在。

然后,您希望能够在Tomcat中部署另一个应用程序。也许第二个应用程序使用第一个应用程序也使用的库,但版本不同。因此,你希望每个应用都有自己的独立类装入器,否则应用 2 的类可能会严重干扰应用 1 中的类。

然后,您希望能够取消部署其中一个 Web 应用程序。因此,必须销毁其类加载器并进行垃圾回收,以避免巨大的内存泄漏。

当然,还有许多其他用法,但这是最常用的用法(根据我的经验)。


推荐