在运行时更新Java代码

时间:2010-06-20 12:48:58

标签: java runtime

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

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

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

4 个答案:

答案 0 :(得分:8)

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

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

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

能够进行演示是一件很好的事情,但对于大多数应用程序而言,这是不值得的。在我看来,当然:)

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

答案 1 :(得分:5)

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

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

否则您可以使用类加载器,如另一个所提到的,但它只提供动态类加载,而不是替换。加载两次的同一类将被视为两种不同的类型。结合界面和/或一些反射,它可以提供在运行时更新应用程序的方法。

以下是关于类加载器的一篇很棒的论文的引用,以及用法:

我不会扩展这是好还是坏,因为这不是你的问题,但我认为支持运行时软件的发展是很好的 - 太糟糕了JSR-117从来没有做过!

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

我正在对此进行试验,并通过以下步骤在Eclipse中取得了一些成功。 我在Spring Boot中使用Tomcat。

  1. 从Eclipse运行菜单以调试模式启动应用程序。

  2. 进行所需的代码更改。

  3. 在另一个端口上再次运行同一应用程序。

  4. 如果我看一下从步骤1开始的应用程序,它将使用新代码进行更新。

当我想跳过冗长的应用程序初始化设置时,这对我有帮助。 但是,这并不是一直都有效:如果不是这样,则重新启动Eclipse很有帮助。