在我正在学习的一本书中,他们展示了这个Java代码:
Class c = ClassLoader.getSystemClassLoader().loadClass(name);
Class type = this.getClass().getClassLoader().loadClass(name);
Object obj = type.newInstance();
此代码用于动态加载Java类。这本书继续:
卸载模块引发了一个问题。类加载器无法卸载 类。卸载类需要卸载类加载器本身。 这就是为什么程序员......倾向于定义几个类加载器。
使用此类代码有什么好处?自主计算的想法通常是 - "自主系统管理。"这与Java程序如何受JVM控制有何关系?
来源:自主计算原理设计第166页(Lalanda)
答案 0 :(得分:6)
好处是您可以在运行时决定实际加载和使用的类。对于只有一个类实现的简单Java程序,没有任何好处。
像Osgi这样的复杂环境(Eclipse的基础)为每个模块使用单独的类加载器。这带来了灵活性以及在运行时替换模块的可能性。
另一个"经典" usecase是在运行时加载数据库驱动程序。您可能希望连接到MySQL数据库或Oracle,并且都使用JDBCDriver的不同实现。
<强>增加:强>
Alex Blewitt撰写的一篇非常好的文章讨论了eclipse / osgi类加载概念,可以找到here。
在我自己的编码经验中,我使用eclipse插件进行企业级Web监控项目。监控主要涉及不断抓取网络上的一些资源。每个这样的资源都由监视器插件的实现来监视。并非所有资源都由我们控制,因此当它们发生变化时,我们必须调整处理该资源的插件。在我们卸载旧插件模块时,整个监控应用程序可以继续运行。所有在运行时,几乎没有停机时间(仅适用于需要交换的模块)当然,我使用Eclipse富客户端平台(RCP)隐含了对每个插件的类加载器的使用。您只需要指定哪个插件依赖于哪个插件,然后由RCP平台完成实际的类加载。
像Tomcat这样的Web服务器使用相同的方法,尽管我对Tomcat没有太多经验。
直接实现动态类加载系统可能是一个很好的练习,但对于真实世界的应用程序,我会明确地研究生产等级实现,如Eclipse RCP或Apache Karaf
如果您希望更进一步,并且需要在群集中运行插件,您可能需要查看Gyrex
我无法在此处分享我的代码,但这里有一些代码示例的优秀起点:
答案 1 :(得分:2)
假设以下示例。你开发了一个程序。用户可以为它编写一些插件(或自治程序上下文中的代理)。您的程序将加载配置变量中定义的所有插件(或自定义代理类),如:
plugins: foo.bar.myplug,another.plugin
在这种情况下,您需要动态加载属性中枚举的类。在开发主程序时,这些类是未知的,不能使用正常的类加载。
此外,如果出于任何原因想要卸载这些类(例如,重新读取配置后),则需要自定义类加载器。
<强>附录强>
例如,我们可以想象一个带有“世界”的程序,其中某些“代理”会相互作用。除了主程序中包含的几个代理之外,用户还可以创建自己的代理。主程序将负责代理之间的交互(世界规则):向代理发送事件;更新考虑到代理商行为的世界状况;保存,加载世界; ......
每个代理都是一个Java类,必须包含主程序调用的方法“public Action handleEvent(Event)”。默认情况下,存在一些预定义的类,如“Person.class”,“SearchRobot.class”,每个类都有自己的“handleEvent”实现。所有这些都扩展了抽象类“Agent”。
该程序允许用户创建自己的代理。用户必须创建一个包含方法“handleEvent”的新类(扩展代理)。以示例用户类“WalkerAgent.class”为例,它具有一个启发式短路径,可以遍布世界各地。
主程序还将有一个名为“plugins”的属性。此属性必须包含用户代理列表:
plugins: foo.bar.WalkerAgent
当主程序启动时,它应该加载“plugins”属性中枚举的所有类。像(伪代码)的东西:
read property "plugins" and split it by ","
for each split in previous:
call loadClass
为了创建类“WalkerAgent”的代理的新实例,您不能在主程序中写入“new WalkerAgent()”,因为在编写主程序时该类不存在。相反,您必须调用“loadClass”返回的类的“newInstance()”。
现在,代理“WalkerAgent”已准备好以与预定义代理“Person”和“RobotSearch”相同的方式使用。
(PS:显然,在自主计算中,世界就是一个网络描述,代理人会执行“监控IP”,“路由优化器”等操作......这个例子使用了更简单的概念理解)。