【问题标题】:Java hot-code-replace fails on static methodsJava 热代码替换在静态方法上失败
【发布时间】:2019-01-05 20:24:03
【问题描述】:

热代码替换适用于实例方法,但不适用于静态方法。我收到这个错误

请注意,我只是将println 添加到static private 甚至public 方法的主体中,而不是更改任何方法修饰符,如错误消息所示。如何实现这种热替换?

我正在使用 Eclipse Oxygen 和 Java 8 JRE。 Maven com.google.cloud.tool:appengine-maven-plugin 用于以调试模式启动应用程序,目标为
appengine:run。然后我连接到 Eclipse 远程调试器。

【问题讨论】:

  • 可以优化static private 方法,例如。 G。通过内联它被调用的地方。该方法是否存在于字节码中?如果不是,Hot Code Replace 找不到要替换的方法。
  • 好点但是所有静态方法都会发生这种行为,包括公共

标签: java eclipse google-app-engine hot-code-replace


【解决方案1】:

在热代码替换时,whole class file is replaced。要找出无法交换文件的确切原因,您必须将原始字节码与要更改的字节码进行比较。

默认情况下,Maven 使用javac 进行编译,而要交换的文件是使用 Eclipse 自己的 Java 编译器编译的。不同的优化可能导致类文件不可交换,尤其是在使用私有方法、字段或常量时。

以下方法之一可能会解决您的问题:

【讨论】:

  • 在 Maven 构建中使用 Eclipse 编译器为我做到了!具体来说,添加 eclipseorg.codehaus.plexusplexus-compiler-eclipse2.8.1
  • 关键是要有相同的编译器——我们使用的是外部JDK编译,这与Eclipse的内部编译器不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 2022-07-22
相关资源
最近更新 更多