java - 通过热插拔机制在运行时更改方法

标签 java runtime hotswap

假设我们有一个简单的 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);
   }
}

编译并运行后,输出如下:

Today is a nice day with a number 0

Today is a nice day with a number 1

Today is a nice day with a number 2

Today is a nice day with a number 3

...

我的问题:是否存在(或即将出现)某种在运行时交换可替换方法的方法?比如用新版本的可替换的版本编写另一个版本的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. 运行原始程序
  2. 编写修改版本
  3. 使用命令行程序连接到正在运行的 JVM 并替换现有方法

这样,在运行时,就会发生这种情况:

Today is a nice day with a number 15000

Today is a nice day with a number 15001

Today is an even nicer day with a number 15002

Today is an even nicer day with a number 15003

...

假设上面的程序是独立的,运行在标准的Java SE环境中,类路径上没有其他任何东西,所以它几乎是一个Hello world风格的程序。

注意:我知道字节码操作(cglib)、aspectJ等技术, jRebel , JMX 、Java EE 中方法的热交换等都存在,但它们不是我所想的。想想 Erlang。

最佳答案

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

关于java - 通过热插拔机制在运行时更改方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53697352/

相关文章:

java - 出现错误 : Exception in thread "main" java.net.SocketException:套接字已关闭

java - 反射(reflection):如何找到一个接受对象列表的构造函数?

java - java中字符串的可重用性?

java - Nim 游戏再次出错

java - 如何继承/替换java的final类?

java - 带有 HotSwap 代理的 JBoss

java - 如果内存不稀缺,您将如何用一种语言实现一种排序,其中包含用于表示和排序集合的库

Java3D - 找不到某些类,但类路径设置正确

C++ 构造函数运行时/编译时

java - 我可以使用 Oracle Java 7 HotSpot VM 安装 DCEVM 吗?