我希望在不重新启动Java JVM的情况下多次向Java类文件动态添加和删除检测代码。这可能吗?
答案 0 :(得分:7)
我建议您查看java.lang.instrument
package,尤其是ClassFileTransformer
。
这是一篇好文章:Instrumentation: Modify Applications with Java 5 Class File Transformations
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。