Java字节码注入

3
我正在努力理解这个概念。我的问题是:
  1. 从性能角度来看,这个操作的成本高不高?为什么?
  2. 如果我想通过在方法调用后注入一些代码来截取传递给方法的某些参数,这个注入是一次性的还是每次方法调用时都会发生?
  3. 这个注入代码位于哪里?在应用程序源代码本身还是其他地方?
1个回答

9
你可以通过Java代理实现字节码注入。
Java代理是一个库,它拦截类加载器中的字节码加载,并在其加载到JVM之前进行增强。当然,这样的库通常依赖于字节码操作库,如Javassist、ASM或CGLib。因此,字节码操作只在加载类时执行一次。
请参阅官方Javadoc: http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html 本文解释了如何做你想做的事情: http://today.java.net/pub/a/today/2008/04/24/add-logging-at-class-load-time-with-instrumentation.html 此外,如果您真的对字节码基础知识感兴趣,这篇来自JRebel开发人员之一的文章应该会让您满意:http://arhipov.blogspot.com/2011/01/java-bytecode-fundamentals.html 最后,您可以看一下Seren,这是我刚开始编写的一个库。它是一个增强可序列化类的Java代理程序。这只是个开始,但它已经可以工作了。https://github.com/oliviercroisier/seren

谢谢你的回答,但你仍然没有回答那三个问题。 - Mike G
3
抱歉,这里有一些更多的解释。1:没有性能惩罚,它是纯字节码(没有代理)。2:它仅在类加载时发生,请参见上文。3:代理代码在一个jar文件中,您必须在命令行上提供(-javaagent vm参数);生成的代码与“正常”的代码一起存在于堆上的PermGen空间中。 - Olivier Croisier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接