Java字节码注入

Mik*_*e G 3 java code-injection

我试图围绕这个概念.我的问题是:

  1. 从性能的角度来看,这项操作是否成本高昂,如果是这样,为什么?
  2. 如果我试图通过在调用方法之后注入一些代码来拦截传递给方法的一些参数,那么这次注入会发生一次还是每次调用该方法时都会发生?
  3. 这个注入代码在哪里?在应用程序源本身或其他地方?

Oli*_*ier 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

  • 对不起,这里有一些解释.1:没有性能损失,它是纯字节码(无代理).2:它只发生一次,在课程加载时,见上文.3:代理程序代码位于您必须在命令行上提供的jar中(-javaagent vm参数); 生成的代码与堆中PermGen空间中的其他"普通"代码一起使用. (3认同)