当前位置: 首页 > 面试题库 >

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

杭志泽
2023-03-14
问题内容

假设我们有一个仅包含一个类的简单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世界风格的程序。

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


问题答案:

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



 类似资料:
  • 我正在做一个Spring Boot项目,我试图将我们的IDE从STS切换到Intellice。除调试时外,一切正常。每当我更改Java类时,Spring都会尝试重新启动整个应用程序,但失败时会显示以下消息: 以下是有关环境的一些上下文: > spring boot devtools 1.5.9依赖项被添加到pom.xml中 “首选项”选项- 我尝试过使用“cmd shift a”选项进行调试- I

  • 在我的应用程序运行时,是否有(现在)官方支持的方式更改OSX通知中心的NSUserNotifications图标?我在网上搜索了一下,但答案并不是“最近的”,所以我只想再核实一下。 我想在标题/名称旁边显示当前播放的Spotify曲目的艺术品 我到现在为止所做的一切都很丑陋: > 重启通知中心以“忘记”它最终缓存的图标 [通知中心终止];[通知中心终止]; 我知道我真的不该这么做

  • 本文向大家介绍简单通过settimeout看javascript的运行机制,包括了简单通过settimeout看javascript的运行机制的使用技巧和注意事项,需要的朋友参考一下 前言 我们知道JS是一个单线程的语言,而且其运行机制比较特殊。 下面我们通过settimeout的几个示例来展现javascript的运行机制的特殊点 示例1 示例2 javascript会先把需要运行的内容放到任务

  • 问题内容: 如何在运行时更新此环境变量,以便ctypes可以在任何地方加载库?我尝试了以下方法,但似乎都没有用。 问题答案: 在运行诸如Python之类的程序时,动态加载程序(ld.so.1或类似的文件)已经读取LD_LIBRARY_PATH,并且此后将不会注意到任何更改。因此,除非Python软件本身评估LD_LIBRARY_PATH并使用它来构建可能的库路径名或要使用的等效函数,否则在脚本中设

  • 问题内容: 我想向管理界面公开一些(特定于应用程序的)设置,以便用户可以轻松地更改它们,也不必重新启动Django。 我应该怎么做? 我在http://djangopackages.com/grids/g/live-setting/上签出了应用程序(btw django-constance最吸引人),但实际上所有这些应用程序所做的就是将值存储在数据库中,从而提供了一个网站。界面来更改它们,并进行缓

  • 我有一个名为login.js的VUEX存储模块,如下所示 登录。vue代码 登录功能工作,令牌是第一次设置,但当我刷新浏览器的不见了。 在浏览器中,它显示如下 但是如果我通过开发工具提交,它会起作用,状态会变得持久。 类似性质的问题,但不回答这个问题。 vuex提交不提交到存储 Vue2 Vuex提交未提交(不带Vue devtools) 运行Vuex突变,但组件在vue开发工具中手动提交之前不会