什么是Java字节码注入?


问题内容

Java字节码注入到底是什么?为什么要使用它?


问题答案:

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

想象一个场景,我想找出多少次方法

public void bar();

在中被调用Foo.class。我可以在类加载期间使用java.lang.instrument该拦截器编写一个代理Foo.class,然后使用ASM对其进行修改,以便bar()调用com.amir.agent.incrementCount()方法条目。

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

$java -javagent:MyAgent Foo  //assuming Foo has a main() defined

并且在运行时,Foo.class不仅可以完成其正常工作,而且还可以完成我在MyAgent每次bar()调用时定义的工作。

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