什么是Java字节码注入?

Mar*_*eon 24 java bytecode

究竟什么是Java字节码注入以及为什么要使用它?

Ami*_*ani 28

Java代码编译成bytecode(Foo.java ->> Foo.class).字节码注入Foo.class在运行时进行修改,以便在加载和运行之前将代码注入其中.

想象一下我想知道多少次方法的场景

public void bar();
Run Code Online (Sandbox Code Playgroud)

被调用Foo.class.我可以在类加载期间使用java.lang.instrument截取来编写代理Foo.class,使用ASM修改它以便bar()调用com.amir.agent.incrementCount()方法入口.

现在我可以运行我的程序:

$java -javagent:MyAgent Foo  //assuming Foo has a main() defined
Run Code Online (Sandbox Code Playgroud)

并且在运行时,Foo.class它不仅会执行其正常工作,还会执行我在MyAgent每次bar()调用时定义的工作.

有关从头开始编写代理的指针,请从此处开始.