java 通过热交换机制在运行时更改方法

gblwokeq  于 2023-02-02  发布在  Java
关注(0)|答案(7)|浏览(129)

假设我们有一个简单的Java程序,它只包含一个类:

public class HelloWorld {

   private static void replacable(int i) {
      System.out.println("Today is a nice day with a number " + i);
   }        

   public static void main(String[] args) throws Exception {
      for(int i = 0; i < 100000; ++i) {
      replacable(i);
      Thread.sleep(500);
   }
}

编译并运行后,输出如下所示:
今天天气很好,数字是0
今天天气很好,是第一天
今天是个好日子,数字2
今天是个好天气,有3号
...
我的问题:是否存在(或即将出现)在运行时交换replacable方法的方法?比如用replacable的新版本编写HelloWorld的另一个版本,编译它,然后在已经运行的JVM中编译旧版本?
所以,如果我这样写新版本:

private static void replacable(int i) {
   System.out.println("Today is an even nicer day with a number " + i);
}

是否有类似于Erlang's hot code swapping东西可以实现这一点:
1.运行原始程序
1.写入修改版本
1.使用命令行程序连接到正在运行的JVM并替换现有方法
因此,在运行时,将发生以下情况:
今天天气很好,数字是15000
今天天气很好号码是15001
今天天气更好,号码是15002
今天天气更好,号码是15003
...
假设上面的程序是独立的,运行在标准的JavaSE环境中,类路径上没有其他内容,所以它几乎是一个Hello world风格的程序。
注:我知道像字节码操作(cglib)、aspectJjRebelJMX、Java EE中方法的热交换等技术是存在的,但它们不是我所想的。

3gtaxfhh

3gtaxfhh1#

您可以使用开源HotSpot VM或商业JRebel IDE插件轻松实现您的目标(查看比较表here)。

szqfcxe2

szqfcxe22#

你可以通过类加载器来完成。例如,如果你熟悉Servlet容器,比如Tomcat,当你在开发中修改页面时,它会重新加载页面。这里有一个great explanation of creating dynamic code in java。它不仅解释了加载,还解释了动态编译源代码。你应该能够将所涉及的概念应用到你想要利用的任何重新加载代码的策略中。

qzlgjiam

qzlgjiam3#

我在许多项目中使用过hotswap ant task,目标java应用程序可以通过Ant、Eclipse、命令提示符或任何其他方式启动,只要它是在调试模式下启动并打开适当的端口即可,链接页面提供了如何通过Ant执行此操作的说明。
任何数量的类都可以被热交换,只要这些改变不是结构性的。方法体的改变通常很容易被热交换。代码可以通过shell或Eclipse运行一个ant脚本来热交换。
在工作中,我使用了一个脚本,通过比较类文件上的时间戳来自动热交换代码更改,这类似于项目页面上的示例,它显示了一个简单的示例,仅热交换更改的类。
补充说明:这利用了JPDA

mutmk8jj

mutmk8jj4#

您可以通过JPDA(Java平台调试器体系结构)接口执行此操作:http://download.oracle.com/javase/1.4.2/docs/guide/jpda/enhancements.html#hotswap
它不像Erlang那样是自动的-JVM不会监视类路径中的类文件更改,然后在更改后重新加载并重新链接它们,原因相当明显(Java是为Web部署设计的,您不希望轮询http URL中的更改)。

omjgkv6w

omjgkv6w5#

我发现相对较新的Hotswap Agent文档齐全,功能丰富(最棒的是open source)。

i5desfxk

i5desfxk6#

OSGi怎么样?热插拔是“内置”到规范中的-我认为这也是一个可能的解决方案。

suzh9iv8

suzh9iv87#

您可以使用Strategy设计模式,这样您就有了一个对象(而不是一个方法)来操作,并且有了一个与程序通信的协议来告诉它使用给定的类名作为Strategy对象的类。

相关问题