在 Java 中有 3 个 Class 装载机的原因是什么

What is the reason for having 3 Class loaders in Java

Java 有 3 个 class 装载机:

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

但是为什么 Java 有 3 个不同的 class 加载器而不是只有一个,因为一个 class 加载器可以加载所有必要的 classes?

class 加载器的主要用途是在应用程序服务器中。

您希望能够开始Tomcat(例如)。这已经需要至少一个 classloader 到 运行 tomcat 本身。

然后您希望能够将应用程序部署到 Tomcat。所以 Tomcat 本身需要加载分析应用程序的 classes,在 Tomcat 启动时它甚至不存在。

那么您希望能够在 Tomcat 中部署另一个应用程序。也许第二个应用程序使用第一个应用程序也使用的库,但版本不同。因此,您希望每个应用程序都有自己独立的 class 加载程序,否则应用程序 2 的 classes 可能会严重干扰应用程序 1 的 classes。

那么您希望能够取消部署其中一个网络应用程序。所以它的 class 加载器必须被销毁并进行垃圾收集,以避免巨大的内存泄漏。

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

拥有三个基本 class 加载器(Bootstrap、扩展、系统)的原因主要是安全性。

在 JVM 1.2 版之前,只有一个默认的 class 加载器,也就是当前所谓的 "Bootstrap" class 加载器。

classes 由 class 加载器加载的方式是每个 class 加载器首先调用其父级,如果该父级未找到所请求的 class,当前的自己找

一个关键概念是 JVM 不会授予包访问权限(如果您没有特别提及 privatepublic 或 [=12=,则方法和字段具有的访问权限) ]) 除非请求此访问权限的 class 来自 加载它希望访问的 class 的同一个 class 加载程序

因此,假设用户调用他的 class java.lang.MyClass。理论上,它可以获得对 java.lang 包中所有字段和方法的包访问权,并改变它们的工作方式。语言本身并不能阻止这一点。但是 JVM 会阻止它,因为所有真正的 java.lang classes 都是由 bootstrap class 加载器加载的。不相同的加载程序 = 无法访问。

class 加载程序还内置了其他安全功能,使某些类型的黑客攻击变得困难。

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

有关更详细的解释,请参阅 Bill Venners's "Inside the Java Virtual Machine"

  1. 存在多个 class 加载程序以加载多个应用程序 同时(一个加载服务器和另一个部署在服务器中)。
  2. 每个加载器都有一个层次结构来加载特定的 class确保他们之间的安全。