最近我在一次采访中被问到有关加载类时调用类加载器的顺序。
不幸的是,我从来没有必要编写自己的类加载器,因此当时不熟悉类加载的复杂性。
这让我想知道,他们编写自己的类加载器的原因是什么。
这就是我的问题:人们面临哪些场景需要编写自己的类加载器?
答案 0 :(得分:18)
我目前正在开发一个高度模块化的超大型应用程序,即它包含数百个JAR文件。这意味着类路径字符串变为 huge ,在各种各样的地方引起各种问题,因为各种开发工具无法处理5KB类路径字符串。这是通过编写从文件中读取其类路径的自定义类加载器来解决的。
答案 1 :(得分:10)
典型的原因是您的应用程序正在托管在同一运行时(例如Tomcat)中使用不同版本的相同库的其他应用程序。因此,您必须确保您的类加载器可以为每个应用程序提供相同类的不同版本。
修改强>:
稍微澄清这一点(请参阅评论中的混淆):当说“你的类加载器”时,我认为“java.lang.ClassLoader
的实现”不是这样一个类的实例。实际上,这两个含义都是你的类加载器 s :Tomcat人员实现了不同的ClassLoader
- 类,并且在运行时有更多实例......有关详细信息,请参阅corresponding docs。
答案 2 :(得分:7)
答案 3 :(得分:3)
有些地方实际上是在数据库中存储类(以前就是这些地方,不确定是否已经存在)并使用类加载器在运行时从数据库中获取类。
答案 4 :(得分:2)
当我想在.jar文件中加载.jar文件中的类时,我必须实现一次ClassLoader(这是几年前,我确信现在有一些工具可以帮到你) 。即,您将依赖.jar文件放入一个.jar文件中。
但这是唯一一次,根据我的经验,编写自定义ClassLoader是一件非常罕见的事情。
答案 5 :(得分:1)
看看这个question。
答案 6 :(得分:1)
我遇到了article,其中讨论了为什么(非常简短地)OSGI使用自定义类加载器。
答案 7 :(得分:1)
您可以在没有停机时间的情况下进行软件发布,在24x7运行系统中有一些情况 您可以编写自己的JMX类加载器调用,并在运行时替换类文件。
答案 8 :(得分:0)
我们有一个应用程序框架,其中包含基于它的应用程序“静态绑定”。这意味着您需要为每个应用程序运行一个jvm实例,这不仅对内存使用有害,而且意味着您无法使用超级应用程序从中启动各种应用程序,或者任何简单(非正在运行的应用程序之间的通信。
由于整个事件是从webstart运行的(即有一堆jar作为类路径),防止系统类加载器查找类的解决方案是偏移包。例如,如果你在应用程序foo中有一个类a.b.X
,那么它将作为foo/a/b/X.class
放在jar文件中。
答案 9 :(得分:0)
在我上一份工作中,我们实现了一个可能具有“插件逻辑查询定义”的服务器。 (客户端可以按名称调用查询,服务器查找该名称的已注册查询并运行它。)
查询定义是jar中包含的代码和/或元数据。
通过我们的控制台应用程序将jar上传到服务器。
上传时(以及稍后服务器重新启动时),我们的框架会为jar创建一个类加载器,将其加载到正在运行的服务器中。
答案 10 :(得分:0)
我有一次这样做。我们必须使用由第三方供应商提供的API,并且此API使用hibernate3.jar的奇怪版本。 因此,我们必须使用自定义类加载器加载此特定jar,以便获取“serial version UID”异常。
答案 11 :(得分:0)
我看过一篇好文章here。它讨论了不同的类加载器,类加载器层次结构和自定义类加载器。