什么是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演示。