在Java中使用3个类加载器的原因是什么?

时间:2015-01-18 15:12:22

标签: java classloader

Java有3个类加载器:

  • 自举,
  • 扩展和
  • 系统

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

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

3 个答案:

答案 0 :(得分:10)

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

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

类加载器加载类的方式是每个类加载器首先调用其父类,如果该父类没有找到所请求的类,则当前的类正在查找它。

一个关键概念是JVM不会授予包访问权限(如果您没有特别提及privatepublicprotected,那么方法和字段的访问权限除非要求访问的类来自加载了它希望访问的类的相同类加载器

因此,假设用户调用他的班级java.lang.MyClass。从理论上讲,它可以获取java.lang包中所有字段和方法的包访问权限,并改变它们的工作方式。语言本身并不能阻止这种情况。但是JVM会阻止这个,因为所有真正的java.lang类都是由bootstrap类加载器加载的。不一样的装载机=无法访问。

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

为什么三个类加载器?因为它们代表三个层次的信任。最值得信任的类是核心API类。接下来是安装的扩展,然后是类路径中出现的类,这意味着它们是您机器的本地扩展。

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

答案 1 :(得分:3)

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

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

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

然后,您希望能够在Tomcat中部署另一个应用程序。也许第二个应用程序使用的是第一个也使用的库,但是使用的是另一个版本。所以你希望每个应用程序都有自己独立的类加载器,否则app 2的类可能会干扰app 1中的类。

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

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

答案 2 :(得分:0)

  1. 存在多个类加载器以加载多个应用程序     同时(一个加载服务器和其他部署在服务器中)。
  2. 每个加载器都有一个层次结构,只能加载某些     确保他们之间安全的课程。