在我正在学习的一本书中,他们展示了这个Java代码:
Class c = ClassLoader.getSystemClassLoader().loadClass(name);
Class type = this.getClass().getClassLoader().loadClass(name);
Object obj = type.newInstance();此代码用于动态加载Java类。这本书接着说:
卸载模块引发了一个问题。类加载器无法卸载类。卸载类需要卸载类加载器本身。这就是为什么程序员。倾向于定义几个类加载器。
使用这样的代码有什么好处?自主计算的思想通常是“自治系统管理”。这与Java程序在JVM控制下的关系如何?
资料来源:自主计算原则设计第166页( Lalanda)。
发布于 2015-07-11 22:41:32
好处是您可以在运行时决定实际加载和使用哪些类。对于简单的Java程序,只有一个类的实现没有好处。
像Osgi这样的复杂环境(Eclipse的基础)为每个模块使用单独的类加载器。这带来了灵活性和在运行时替换模块的可能性。
另一个“经典”用法是在运行时加载数据库驱动程序。您可能希望连接到MySQL数据库或Oracle,并且两者都使用不同的JDBCDriver实现。
加法:
Alex的一篇非常好的文章讨论了eclipse/osgi类加载的概念,它可以找到这里。
在我自己的编码经验中,我在企业级web监控项目中使用了eclipse插件。监控主要涉及到不断地在网络上抓取一些资源。每个这样的资源都由监视器插件的实现来监控。并不是所有的资源都是由我们控制的,所以当资源发生变化时,我们必须调整处理该资源的插件。整个监控应用程序可以继续运行,而我们卸载旧插件模块对新的。当然,在运行时,几乎没有停机时间(只对需要交换的模块),我使用每个插件的类加载器是通过使用(RCP)隐式的。您只需指定哪个插件依赖于哪个插件,而实际的类加载则由RCP平台完成。
像Tomcat这样的use服务器使用同样的方法,尽管我对Tomcat没有太多的经验。
直接实现动态类加载系统可能是一个很好的练习,但对于实际应用程序,我将明确地研究产品级实现,如日食RCP或阿帕奇卡拉夫。
如果您想更进一步,并且需要在集群中运行您的插件,您可能需要查看吉雷克斯。
我不能在这里共享我的代码,但是这里有一些很好的代码示例起点:
发布于 2015-07-25 20:50:38
假设下面的例子。你开发了一个程序。用户可以为它编写一些插件(或自治程序上下文中的代理)。您的程序将加载在配置变量中定义的所有插件(或自定义代理类),如:
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“的代理的新实例,不能在主程序中编写”新WalkerAgent()“,因为编写主程序时类不存在。相反,必须调用"newInstance()“返回的类的”loadClass()“。
现在,代理"WalkerAgent“可以像预定义的代理"Person”和"RobotSearch“一样使用。
(PS:很明显,在自主计算中,世界是一个网络描述,代理执行诸如“监视IP”、“路由优化器”、.等行为。这个例子使用了更容易理解的概念)。
https://stackoverflow.com/questions/31362535
复制相似问题