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

GD_*_*ava 9 java classloader

Java有3个类加载器:

  • 自举,
  • 扩展和
  • 系统

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

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

Rea*_*tic 11

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

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

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

一个关键的概念是,JVM将不予包访问(即方法和字段,如果您没有具体提到的访问private,public或protected)除非请求该访问的类来自同一类加载器装入的类它希望访问.

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

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

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

有关更广泛的解释,请参阅Bill Venners的"Java虚拟机内部".