我正在尝试理解这个概念。我的问题是:
- 从性能角度来看,此操作的成本是否昂贵?如果是,为什么?
- 如果我试图通过在调用方法后注入一些代码来拦截传递给该方法的某些参数,那么这种注入是发生一次还是每次调用该方法时都会发生?
- 该注入代码驻留在哪里?在应用程序源本身还是其他地方?
您可以使用 Java 代理来实现字节码注入。
java Agent 是一个库,它拦截类加载器处加载的字节码,并在加载到 JVM 之前对其进行增强。当然,这样的库通常依赖于字节码操作库,例如 Javassist、ASM 或 CGLib。
因此,字节码操作仅在类加载时完成一次。
请参阅官方Javadoc:http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html 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 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 http://arhipov.blogspot.com/2011/01/java-bytecode-fundamentals.html
最后,你可以看一下Seren,一个我刚刚开始写的库。它是一个增强可序列化类的 Java 代理。这只是开始,但它确实有效。https://github.com/oliviercroisier/seren https://github.com/oliviercroisier/seren
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)