如何为已经运行的实例更改Java类的代码?

时间:2011-01-28 12:05:53

标签: java

我希望在不重新启动Java JVM的情况下多次向Java类文件动态添加和删除检测代码。这可能吗?

4 个答案:

答案 0 :(得分:7)

我建议您查看java.lang.instrument package,尤其是ClassFileTransformer

这是一篇好文章:Instrumentation: Modify Applications with Java 5 Class File Transformations

对于实际的字节码生成,我建议您查看BCELASM等库。

JRebel框架也可能让您感兴趣。它可以在运行时更改方法体的实现,添加/删除方法和构造函数,添加/删除字段,添加/删除类等。

答案 1 :(得分:2)

您可以使用辅助类(策略设计模式),可以在运行时将其替换为另一个类。

答案 2 :(得分:1)

您可以使用Jrebel进行热部署。它允许您在不重启服务器的情况下更改代码。

答案 3 :(得分:0)

您也可以查看JBoss的ByteMan。它使用相同的Java代理机制,特别支持安装和卸载修改脚本,请参阅tutorial。以下是教程的简略版本:

例如,假设我们有一些正在运行的Java Process:

$ jps
15295 Jps
4884 main

然后我们可以将ByteMan安装到正在运行的进程中:

$ bminstall.sh 4884

然后您可以创建一个ByteMan脚本:

$ youreditor thread.btm
RULE trace thread start
CLASS java.lang.Thread
METHOD start()
IF true
DO traceln("*** start for thread: "+ $0.getName())
ENDRULE

然后,您可以使用以下命令安装ByeMan脚本:

$ bmsubmit.sh -l thread.btm

删除:

$ bmsubmit.sh -u thread.btm

要列出当前正在运行的内容,只需发出不带任何参数的内容:

$ bmsubmit.sh

如果您在Windows上运行,请使用.bat替换每个命令中的.sh。