Java中不同类装入器的需求是什么

2022-09-03 18:37:05

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


答案 1

主要需求是隔离。

假设一个页面上有 3 个小程序,每个小程序都使用不同版本的库 foo.jar。您希望这些小程序中的每一个都使用其自己的库版本运行,并确保它不会在另一个小程序的脚趾上行走。这要归功于不同的类装入器。

部署在单个容器上的 Web 应用程序也是如此。在未部署任何应用的情况下启动 Java 容器,然后部署应用。您希望容器能够从它启动时甚至不知道的位置加载类。如果部署了另一个 web 应用,则你希望另一个应用具有自己的类和库,这些类和库与第一个应用的类和库不同且隔离。

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


答案 2

在很多实际情况下,您需要的功能超出了系统类装入器提供的功能:

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

最后一点特别强大(也是我使用它们的主要原因)。由于 Java 字节码是跨平台通用的,因此您可以使用它来检测任何系统上的类:测量调用了哪些方法,禁止安全关键调用,将 System.out 访问转移到您自己的自定义日志记录例程,或者执行高级动态 bug 测试例程。