【问题标题】:Java byte-code injectionJava字节码注入
【发布时间】:2012-01-19 13:16:33
【问题描述】:

我正试图围绕这个概念展开思考。我的问题是:

  1. 从性能的角度来看,此操作成本高吗?如果是,为什么?
  2. 如果我试图通过在调用方法后注入一些代码来拦截传递给方法的某些参数,这种注入是发生一次还是每次调用方法时都会发生?
  3. 此注入代码位于何处?在应用程序源本身还是其他地方?

【问题讨论】:

    标签: java code-injection


    【解决方案1】:

    您可以使用 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 空间中。
    猜你喜欢
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多