在我正在学习的一本书中,他们展示了这个Java代码:
Class c = ClassLoader.getSystemClassLoader().loadClass(name);
Class type = this.getClass().getClassLoader().loadClass(name);
Object obj = type.newInstance();
Run Code Online (Sandbox Code Playgroud)
此代码用于动态加载Java类.这本书继续:
卸载模块引发了一个问题.类加载器无法卸载类.卸载类需要卸载类加载器本身.这就是为什么程序员...倾向于定义几个类加载器.
使用此类代码有什么好处?自主计算的想法通常是"自主系统管理".这与Java程序如何受JVM控制有何关系?
来源:自主计算原理设计第166页(Lalanda撰写)
好处是您可以在运行时决定实际加载和使用的类.对于只有一个类实现的简单Java程序,没有任何好处.
像Osgi这样的复杂环境(Eclipse的基础)为每个模块使用单独的类加载器.这带来了灵活性以及在运行时替换模块的可能性.
另一个"经典"用例是在运行时加载数据库驱动程序.您可能希望连接到MySQL数据库或Oracle,并且都使用JDBCDriver的不同实现.
加成:
Alex Blewitt的一篇非常好的文章讨论了eclipse/osgi类加载概念,可以在这里找到.
在我自己的编码经验中,我使用eclipse插件进行企业级Web监控项目.监控主要涉及不断抓取网络上的一些资源.每个这样的资源都由监视器插件的实现来监视.并非所有资源都由我们控制,因此当它们发生变化时,我们必须调整处理该资源的插件.在我们卸载旧插件模块时,整个监控应用程序可以继续运行.所有在运行时,几乎没有停机时间(仅适用于需要交换的模块)当然,我使用Eclipse富客户端平台(RCP)隐含了对每个插件的类加载器的使用.您只需要指定哪个插件依赖于哪个插件,然后由RCP平台完成实际的类加载.
像Tomcat这样的Web服务器使用相同的方法,尽管我对Tomcat没有太多经验.
直接实现动态类加载系统可能是一个很好的练习,但对于真实世界的应用程序,我肯定会研究生产级实现,如Eclipse RCP或Apache Karaf
如果你想让整个事情更进一步,需要在集群中运行你的插件,你可能想看看Gyrex
我不能在这里分享我的代码,但这里有一些代码示例的优秀起点:
| 归档时间: |
|
| 查看次数: |
356 次 |
| 最近记录: |