开发者

How can I change the code for a Java class for an already running instance?

I wish to dynamically add and remove instrumentation cod开发者_运维百科e to a Java class file several times without restarting the Java JVM. Is this possible?


I suggest you look at the java.lang.instrument package, especially the ClassFileTransformer.

Here is a good article: Instrumentation: Modify Applications with Java 5 Class File Transformations

For actual bytecode generation, I suggest you have a look at libraries such as BCEL or ASM.

The JRebel framework may also interest you. It can change implementation of method bodies, add / remove methods and constructors, add/remove fields, add/remove classes etc, all in runtime.


You could use a helper class (Strategy Design Pattern) which may be swapped for another one at run-time.


You can use Jrebel for hot deployment. It will allow you to change the code without server restart.


You also might want to look at ByteMan from JBoss. It uses the same Java agent mechanism and specifically supports installing and uninstalling your modification scripts, see the tutorial. What follows is an abridged version of the tutorial:

For example lets say we have some running Java Process:

$ jps
15295 Jps
4884 main

We can then install ByteMan into the running process:

$ bminstall.sh 4884

You could then create a ByteMan script:

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

You can then install a ByeMan script with:

$ bmsubmit.sh -l thread.btm

To remove:

$ bmsubmit.sh -u thread.btm

To list what is currently running just issue it without any arguments:

$ bmsubmit.sh

If you are running on windows replace the .sh in each command with .bat.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜