【发布时间】:2015-01-18 15:12:22
【问题描述】:
Java 有 3 个类加载器:
- 引导带,
- 扩展和
- 系统
他们只有一个角色;从不同的包中加载类。
但是为什么 Java 有 3 种不同的类加载器而不是只有一种,因为一个类加载器可以加载所有必要的类?
【问题讨论】:
-
由特定类加载器加载的类从该类加载器继承其权限。普通 JVM 实例中有三个基本权限域。当然,还有更多。
标签: java classloader
Java 有 3 个类加载器:
他们只有一个角色;从不同的包中加载类。
但是为什么 Java 有 3 种不同的类加载器而不是只有一种,因为一个类加载器可以加载所有必要的类?
【问题讨论】:
标签: java classloader
拥有三个基本类加载器(Bootstrap、扩展、系统)的原因主要是安全性。
在 JVM 1.2 版之前,只有一个默认的类加载器,也就是目前所谓的“Bootstrap”类加载器。
类加载器加载类的方式是,每个类加载器首先调用其父类,如果该父类没有找到所请求的类,则当前的类会自行查找。
一个关键概念是 JVM 不会授予包访问权限(如果您没有特别提到 private、public 或 protected,则方法和字段具有的访问权限)除非类请求此访问来自同一个类加载器,该类加载器加载了它希望访问的类。
因此,假设用户调用他的班级java.lang.MyClass。从理论上讲,它可以获得对java.lang 包中所有字段和方法的包访问权限,并更改它们的工作方式。语言本身并不能阻止这一点。但是 JVM 会阻止这一点,因为所有真正的 java.lang 类都是由引导类加载器加载的。不同的加载器 = 没有访问权限。
类加载器中内置了其他安全功能,使得某些类型的黑客攻击变得困难。
那么为什么要三个类加载器呢?因为它们代表了三个级别的信任。最受信任的类是核心 API 类。接下来是安装的扩展,然后是出现在类路径中的类,这意味着它们在您的机器上是本地的。
【讨论】:
类加载器的主要用途是在应用程序服务器中。
您希望能够启动 Tomcat(例如)。这已经需要至少一个类加载器来运行 tomcat 本身。
然后您希望能够将应用程序部署到 Tomcat 中。所以Tomcat本身需要加载一个分析应用程序的类,这个类在Tomcat启动时甚至都不存在。
然后您希望能够在 Tomcat 中部署另一个应用程序。也许第二个应用程序使用了第一个应用程序也使用的库,但版本不同。因此,您希望每个应用程序都有自己的隔离类加载器,否则应用程序 2 的类可能会严重干扰应用程序 1 的类。
然后您希望能够取消部署其中一个 web 应用程序。所以它的类加载器必须被销毁和垃圾回收,以避免巨大的内存泄漏。
当然还有很多其他用法,但这是最常用的一种(根据我的经验)。
【讨论】:
【讨论】: