什么是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()
在方法条目上调用com.amir.agent.incrementCount()
。
现在我可以运行我的程序:
$java -javagent:MyAgent Foo //assuming Foo has a main() defined
并且在运行时, Foo.class
不仅会正常工作,还会在每次调用bar()
时在MyAgent
定义的工作。
有关从头开始编写代理的指针,请从此处开始。
第一次谷歌搜索提供了一个有趣的阅读Java编程:字节码注入
解决问题的第二部分。 我使用它,因为我很懒,不想花一半的(工作)生活写作吸气剂和制定者。 相反,我在我的类定义之前放了一个注释@Data,一切都完成了。
观看Project Lombok的3分钟video演示。