Java字节码注入究竟是什么以及为什么要使用它?
答案 0 :(得分:25)
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()
中定义的工作。
有关从头开始编写代理的指针,请启动here。
答案 1 :(得分:3)
首次谷歌搜索提供了一个有趣的阅读Java Programming: Bytecode Injection
答案 2 :(得分:1)
解决问题的第二部分。我使用它,因为我很懒,不想花一半的(工作)生活写出吸气剂和制定者。相反,我在我的类定义之前放了一个注释@Data,一切都完成了。
请参阅Project Lombok上的3分钟视频演示。