Class c = ClassLoader.getSystemClassLoader().loadClass(name); Class type = this.getClass().getClassLoader().loadClass(name); Object obj = type.newInstance();
此代码用于动态加载Java类.这本书继续说:
unloading modules raises an issue. A class loader cannot unload a
class. Unloading a class requires unloading the class loader itself.
This is why programmers .. tend to define several class loaders.
使用这样的代码有什么好处?自主计算的概念通常是“自主系统管理”.这与Java程序如何受JVM控制有关?
来源:自动计算原理设计(由拉兰达)
解决方法
像Osgi这样的复杂环境(Eclipse的基础)为每个模块使用单独的类加载器.这样可以带来灵活性以及在运行时更换模块的可能性.
另一个“经典”用例是在运行时加载数据库驱动程序.您可能想要连接到MysqL数据库或Oracle,并且都使用JDBCDriver的不同实现.
加成:
讨论eclipse / osgi类加载概念的Alex Blewitt的一篇非常好的文章可以在here中找到.
在我自己的编码经验中,我使用eclipse插件进行企业级Web监控项目.监控基本上是关注网络上不断刮擦的资源.每个这样的资源由监视器插件的实现来监视.并不是所有的资源都由我们控制,所以当他们改变时,我们必须调整处理该资源的插件.当我们卸载旧的插件模块时,整个监控应用程序可以继续运行.所有在运行时,几乎没有停机时间(仅对于需要交换的模块)当然,我使用Eclipse胖客户端平台(RCP)隐藏了每个插件的类加载器.您只需要指定哪个插件依赖于哪个和实际的类加载,然后由RCP平台完成.
像Tomcat这样的Web服务器使用相同的方法,虽然我没有太多的Tomcat经验.
直接实现动态类加载系统可能是一个很好的练习,但是对于现实世界的应用程序,我将明确地研究生产级实现,如Eclipse RCP或Apache Karaf
如果您想将整个事情进一步整理,并且需要在群集中运行插件,则可能需要查看Gyrex
我不能在这里分享我的代码,但这里有一些优秀的起点与代码示例:
> http://www.vogella.com/tutorials/EclipsePlugIn/article.html
> https://karaf.apache.org/manual/latest-2.3.x/quick-start.html
> http://www.javaworld.com/article/2077837/java-se/hello–osgi–part-1–bundles-for-beginners.html