大约一年前,我偶然发现了Java中的一个很好的功能,我无法再为我的生活找到它.
通过一些神奇的界面,显然可以在运行时声明一些可替换的类或函数.
我发现了一个很好的示例指南,有人运行了一个简单的小程序,打印出某个消息,然后他使用我不记得的方法更新了程序,突然之间程序用新的替换了旧的打印功能.
我试过通过Java API来激发我的记忆以及谷歌搜索,但没有成功.这里有人可以帮忙吗?
各种app容器都可以做到这一点.
基本上你需要重新加载一个新的类ClassLoader
(除非你在调试器下讨论这个,在这种情况下,有完全不同的API可用).
在我看来,这种事情很少值得麻烦:设计一切以便可以重新加载比设计它要困难得多,因此它可以在新的过程中完全重新启动.如果过程中只加载了一个版本,那么确定运行的代码也更容易确定.
能够演示是一件很好的事情,但对于大多数应用来说,这是不值得的.在我看来,当然:)
请注意,一个值得注意的例外是能够在不重新启动容器的情况下重新加载Web UI层:这可以使生活更轻松.
该热插拔技术是一种添加到Java 1.4,使类文件替换在运行时。该功能是通过工具包的redefineClasses
方法提供的。我认为您也可以通过JPDA界面执行此操作。
这也是我认为首先描述HotSwap机制的研究论文的参考:
寻求灵活安全的Java语言应用程序运行时进化技术
否则,您可以使用Classloader,如其他提到的那样,但它仅提供动态的类加载,而不提供替换。两次加载相同的类将被视为两种不同的类型。结合界面和/或一些反射,它可以提供在运行时更新应用程序的方法。
这是对有关类加载器的出色论文的引用,以及那里的用法:
Java虚拟机中的动态类加载
我不会就这是好是坏进行扩展,因为这不是您的问题,但是我认为拥有对运行时软件演化的支持真是太好了–可惜的是JSR-117从来没有做到!