27

最近我遇到了java自定义类加载器api。我在这里找到了一个用途,kamranzafar 的博客 我对类加载器的概念有点陌生。谁能详细解释一下,我们可能需要或应该使用它的不同场景是什么?

4

3 回答 3

37

自定义类加载器在由多个模块/应用程序组成的大型架构中很有用。以下是自定义类加载器的优点:

  • 提供模块化架构允许定义多个允许模块化架构的类加载器。
  • 避免冲突在类加载器中明确定义类的范围。
  • 支持版本控制支持同一 VM 中不同模块的不同版本的类。
  • 更好的内存管理可以删除未使用的模块,从而卸载该模块使用的类,从而清理内存。
  • 从任何地方加载类类可以从任何地方加载,例如数据库、网络,甚至可以动态定义它
  • 动态添加资源或类以上所有功能都允许您动态添加类或资源。
  • Runtime Reloading Modified Classes 允许您通过将子类加载器创建到包含修改后的类的实际类加载器来重新加载一个或多个类运行时。
于 2012-05-31T07:43:34.610 回答
17

主要用途是在应用程序服务器中,以便它们可以运行两个应用程序而不会发生类冲突。即,如果应用程序 1 有一个与应用程序 2 同名的类,则使用自定义类加载器,应用程序 1 将加载其类,应用程序 2 将加载其类。

此外,如果一个类由自定义类加载器加载,则可以从 JVM 中卸载该类。在应用程序服务器中再次有用。

另一种用途是检测 - 一种进行面向方面编程或使用某些持久性 API 的方法。使用自定义类加载器,您可以在加载的类被传递给正在运行的应用程序之前向它们添加行为。

于 2012-05-31T07:13:21.137 回答
5

Java 类加载器的功能与顾名思义差不多:将类加载到内存中以便它们可以使用。

类也与加载它们的 ClassLoader 链接。

自定义类加载器因此开辟了各种有趣的可能性:

  • 使用不同的类加载器加载同一类的多个版本(例如,解决可能的版本控制冲突)
  • 在运行时动态加载和卸载类
  • 生成新的类(例如,像 Clojure 这样的 JVM 语言使用各种类加载技巧来生成新的编译类以在运行时表示 Clojure 函数)
  • 从非标准源加载类

普通的 Java 应用程序通常不需要担心类加载器。但是,如果您正在编写一个需要托管其他代码的框架或平台,那么它们就会变得更加重要/相关。

于 2012-05-31T07:50:26.627 回答