假设我们有一个简单的 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 的热代码交换的东西,我可以这样做:
- 运行原始程序
- 写修改版
- 使用命令行程序,连接到正在运行的 JVM 并替换现有方法
这样,在运行时,就会发生这种情况:
今天是个好日子,数字 15000
今天是个好日子,号码 15001
今天是更好的一天,数字 15002
今天是更好的一天,数字 15003
...
假设上述程序是独立的,运行在标准的 Java SE 环境中,类路径上没有其他内容,所以它几乎是一个 Hello world 风格的程序。
注意:我知道存在诸如字节码操作 ( cglib )、aspectJ、jRebel、JMX、Java EE 中的方法热交换等技术,但它们不是我所想的。想想二郎。