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()调用时定义的工作。
有关从头开始编写代理的指示,请从此处开始。



