假设我们有一个仅包含一个类的简单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 …
今天是个美好的一天,数字为0
今天是个美好的一天,数字为1
今天是个美好的一天,数字2
今天是个美好的一天,数字3
…
我的问题:replacable在运行时是否存在(或即将出现)某种方法交换方法?比如HelloWorld用新版本的编写另一个版本的,replacable然后在已经运行的JVM中编译然后再编译旧版本?
replacable
HelloWorld
因此,如果我这样编写新版本:
private static void replacable(int i) { System.out.println("Today is an even nicer day with a number " + i); }
有什么类似Erlang的热代码交换的地方吗?
这样在运行时会发生:
今天是个晴天,数字为15000 今天是个美好的一天,电话号码为15001 今天是更好的一天,号码为15002 今天是更好的一天,号码为15003 …
今天是个晴天,数字为15000
今天是个美好的一天,电话号码为15001
今天是更好的一天,号码为15002
今天是更好的一天,号码为15003
假设上面的程序是独立的,可以在标准的Java SE环境中运行,则classpath上没有其他内容,因此它几乎是Hello世界风格的程序。
注意:我知道字节码操作(cglib),aspectJ,jRebel,JMX,Java EE中的方法热交换等技术已经存在,但是它们并不是我想要的。想想Erlang。
您可以使用开源HotSpot VM或商业JRebel IDE插件轻松实现您的目标(在此处查看比较表)。