在运行时更新Java代码

大约一年前,我偶然发现了Java中的一个很好的function,我无法再为我的生活找到它。

通过一些神奇的界面,显然可以在运行时声明一些可替换的类或函数。
我发现了一个很好的示例指南,有人运行了一个简单的小程序打印了某个消息,然后他使用我不记得的方法更新了程序,突然之间程序用新的替换了旧的打印function。

我试过通过Java API来激发我的记忆以及谷歌搜索,但没有成功。 这里有人可以帮忙吗?

各种app容器都可以做到这一点。

基本上你需要在一个新的ClassLoader重新加载该类(除非你在调试器下讨论这样做,在这种情况下,有完全不同的API可用)。

在我看来,这种事情很少值得麻烦:设计一切以便重新加载比设计它要困难得多,因此它可以在一个新的过程中完全重新启动。 如果过程中只加载了一个版本,那么确定运行的代码也更容易确定。

能够演示是一件很好的事情,但对于大多数应用来说,它是不值得的。 在我看来,当然:)

请注意,一个值得注意的例外是能够重新加载Web UI图层而无需重新启动容器:这可以使生活轻松。

HotSwap技术已添加到Java 1.4中,并在运行时启用类文件替换 。 该function通过instrumentation包的redefineClasses方法提供。 我想你也可以通过JPDA界面做到这一点。

这里也是我认为首先描述HotSwap机制的研究论文的参考:

  • 面向Java语言应用程序运行时演化的灵活安全技术

否则你可以像其他提到的那样使用Classloader ,但它只提供动态类加载 ,而不是替换。 加载两次的同一类将被视为两种不同的类型。 结合界面和/或一些reflection,它可以提供在运行时更新应用程序的方法。

以下是关于类加载器的一篇很棒的论文的参考资料,以及它的用法:

  • Java虚拟机中的动态类加载

我不会扩展这是好还是坏,因为这不是你的问题,但我认为支持运行时软件的发展是非常好的 – 这太糟糕了, JSR-117从未实现过!

这通常是我很乐意留给基础设施的一种function,因为很难做到正确且容易出错。 正如Jon在上面提到的, 大多数应用程序不需要它,对于需要它的人来说,基础设施是可用的。

大多数应用程序服务器现在允许热部署,同样大多数应用程序服务器都是可嵌入的,允许它们被拆除以删除您不需要的function。

如果它主要用于开发,您应该看一个透明地提供此function的JRebel 。 我听说他们正在研究运行时解决方案,但我不知道它是否已准备好迎接黄金时段。

如果你真的有动力让它工作,那么考虑使用OSGi。 它有一个陡峭的学习曲线,但是一旦你了解它,它做的大多数事情都是正确的并且运作良好。 我发现pax工具是一个很好的起点,但eclipse工具链也有很好的支持。