java - Java中有3个类加载器的原因是什么

标签 java classloader

Java 有 3 个类加载器:

  • Bootstrap ,
  • 扩展和
  • 系统

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

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

最佳答案

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

在 JVM 1.2 版本之前,只有一个默认的类加载器,也就是目前所谓的“Bootstrap”类加载器。

类加载器加载类的方式是每个类加载器首先调用它的父类,如果父类没有找到请求的类,则当前类加载器自己寻找它。

一个关键概念是 JVM 不会授予包访问权限(如果您没有特别提及 privatepublicprotected) 除非请求此访问的类来自同一个类加载器,该类加载器加载了它希望访问的类。

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

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

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

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

关于java - Java中有3个类加载器的原因是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28011224/

相关文章:

java - 需要用于不同类的两个版本的 jar 文件

Java/Android - 如何使用处理程序设置超时外部服务调用

java - Azure KeyVault : How to add Spring properties with hypehen as secrets

java - 带接口(interface)的实例

java - 什么时候加载 Java 类?

java - 从应用程序类路径加载配置文件

java - 如何从特定的jar加载实现类

java - 为什么 TimeUnit.SECONDS.sleep(10);在它前面的代码之前被调用?

java - 形状对象不接受输入的坐标

java - Java 堆中对象的大小以及方法