如何为已经运行的实例更改Java类的代码? 1 周,5 日 Questions & Answers 357 我希望在不重新启动Java JVM的情况下,多次动态地向Java类文件添加和删除插装代码。这可能吗
# 2 楼答案 您可能还想看看JBoss中的ByteMan。它使用相同的Java代理机制,特别支持安装和卸载修改脚本,请参见tutorial。以下是本教程的节略版本: 例如,假设我们有一些正在运行的Java进程: $ 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上运行,请更换。在每个命令中使用sh。蝙蝠
# 4 楼答案 我建议你看看^{} package,尤其是^{} 这里有一篇好文章:Instrumentation: Modify Applications with Java 5 Class File Transformations 对于实际的字节码生成,我建议您看看诸如BCEL或ASM之类的库 JRebel框架也可能引起您的兴趣。它可以在运行时更改方法体的实现、添加/删除方法和构造函数、添加/删除字段、添加/删除类等
# 1 楼答案
您可以使用Jrebel进行热部署。它将允许您在不重新启动服务器的情况下更改代码
# 2 楼答案
您可能还想看看JBoss中的ByteMan。它使用相同的Java代理机制,特别支持安装和卸载修改脚本,请参见tutorial。以下是本教程的节略版本:
例如,假设我们有一些正在运行的Java进程:
然后,我们可以将ByteMan安装到正在运行的进程中:
然后,您可以创建一个ByteMan脚本:
然后,您可以通过以下方式安装ByeMan脚本:
删除:
要列出当前正在运行的内容,只需在不带任何参数的情况下发出:
如果您在windows上运行,请更换。在每个命令中使用sh。蝙蝠
# 3 楼答案
您可以使用一个助手类(策略设计模式),它可以在运行时替换为另一个
# 4 楼答案
我建议你看看^{} package ,尤其是^{}
这里有一篇好文章:Instrumentation: Modify Applications with Java 5 Class File Transformations
对于实际的字节码生成,我建议您看看诸如BCEL或ASM之类的库
JRebel框架也可能引起您的兴趣。它可以在运行时更改方法体的实现、添加/删除方法和构造函数、添加/删除字段、添加/删除类等