一尘不染

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

java

假设我们有一个仅包含一个类的简单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

今天是个美好的一天,数字为1

今天是个美好的一天,数字2

今天是个美好的一天,数字3

我的问题:replacable在运行时是否存在(或即将出现)某种方法交换方法?比如HelloWorld用新版本的编写另一个版本的,replacable然后在已经运行的JVM中编译然后再编译旧版本?

因此,如果我这样编写新版本:

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

有什么类似Erlang的热代码交换的地方吗?

  1. 运行原始程序
  2. 写修改后的版本
  3. 使用命令行程序,连接到正在运行的JVM并替换现有方法

这样在运行时会发生:

今天是个晴天,数字为15000

今天是个美好的一天,电话号码为15001

今天是更好的一天,号码为15002

今天是更好的一天,号码为15003

假设上面的程序是独立的,可以在标准的Java SE环境中运行,则classpath上没有其他内容,因此它几乎是Hello世界风格的程序。

注意:我知道字节码操作(cglib),aspectJjRebelJMX,Java EE中的方法热交换等技术已经存在,但是它们并不是我想要的。想想Erlang。


阅读 171

收藏
2020-09-08

共1个答案

一尘不染

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

2020-09-08