java中不同类加载器的需求是什么

Ank*_*ani 11 java class classloader

我已经读过java中有不同的类加载器,一个是原始类加载器,也有自定义类加载器,所以我想理解为什么原始类加载器不能为java中的所有类提供服务?为什么需要其他类加载器?

JB *_*zet 12

主要需求是隔离.

假设页面上有3个applet,每个applet使用不同版本的库foo.jar.您希望每个applet都使用自己的库版本运行,并确保它不会在另一个applet的脚趾上行走.这要归功于不同的类加载器.

对于部署在单个容器上的Web应用程序也是如此.在没有部署任何应用程序的情况下启动Java容器,然后部署应用程序.您希望容器能够从它甚至不知道何时启动的位置加载类.如果部署了另一个webapp,您希望这个其他应用程序拥有自己的类和库,这些类和库与第一个应用程序的类和库是不同的.

另一个需求是能够从各个位置加载类:文件系统,还有URL,数据库或其他任何东西.


cre*_*hen 5

在许多实际情况中,您需要超出系统类加载器提供的功能:

  1. 您可以授予对自定义类源的访问权限(例如,通过http)
  2. 您可以缓存数据块(例如,'如果需要此类,那么让我预加载这些其他类')
  3. 您可以合并防止加载某些类的安全协议
  4. 您可以保留使用哪些类的统计信息,以便稍后优化您的jar存档
  5. 您可以在加载类时执行字节码转换('加载时编织'),例如,修改适合某种模式的类.面向方面的编程实现可以使用这种技术.

最后一点特别有用(并且是我使用它们的主要原因).由于Java字节码在各个平台上都是通用的,因此您可以使用它来检测任何系统上的类:测量调用哪些方法,抑制安全关键调用,将System.out访问转移到您自己的自定义日志记录例程,或执行高级动态错误测试例程.