java - 检测 Java 匿名内部类对象

标签 java bytecode instrumentation

因此,给出以下代码:

public MyInterface getMyInterface() {
    return new MyInterface() {
        public SomethingElse getSomethingElse() {
           // ....
        }
    }
}

...
MyInterface obj = getMyInterface();

是否有某种方法可以在该 obj 上调用 getSomethingElse() ?进去做一些字节码修改什么的?

我在那里有生产代码,在不同的情况下(称为“设计时”)我想添加一些跟踪/日志记录和此类代码以帮助进行故障排除和分析。性能对于生产案例至关重要,因此我希望不使用额外的跟踪/日志记录开销。但在设计时的情况下,我想要拥有所有的跟踪信息。

最佳答案

是的,可以做你所要求的事情,尽管肯定有更好的方法来完成它 - 最明显的是创建 MyInterface 的默认实现,然后是它的“跟踪”子类,在调用父类(super class)版本之前扩展和记录。

如果检测是您唯一的选择,那么在设计时运行时,您可以在 Java 5 中使用 java 代理启动项目,或者在 Java 6 中在运行时将 java 代理添加到类路径中。请参阅 instrumentation documentation .

要对类(class)进行检测,您可能需要使用类似 ASM 的工具。 。步骤如下:

  1. 在您的 Agent 类中,实现 java.lang.instrument.ClassFileTransformer 。
  2. 在您的 agentmain() 或 premain() 方法中,request转变类。
  3. 当您接到transform的电话时方法中,您可以使用 Class.getInterfaces() 检查类是否实现了 MyInterface。
  4. (可选)您可以检查其 Class.getEnendingClass() 是否是您在其中编写/找到此代码的类。
  5. 如果类通过了这些健全性检查,则创建一个 ClassWriter,将日志记录添加到 getSomethingElse() 方法。 ASMifier当尝试弄清楚如何生成您想要的代码时有很大帮助。

然后,在生产中,这些代码将不存在。在开发过程中,您可以在环境中添加 Java 代理,这将启用调试。

同样,几乎肯定有更好的方法来做到这一点,但是使用仪器有充分的理由,这是一个关于这样做的迷你速成类(class)。

希望有帮助,

关于java - 检测 Java 匿名内部类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9229239/

相关文章:

php - AWS X-Ray PHP 检测

Android Instrumentation - 断言失败

Java unicode 比较

java - 方法参数和局部变量是线程安全的

java - 打印用户定义对象的方法

java - "static synthetic"是什么意思?

java - Node 成员是否持有另一个 Node 或者它在 java 中的地址

java - 我可以以某种方式从新的 Java 程序运行以前编译的 Java 字节码吗?

java - 使用 BCEL 在现有方法中注入(inject)代码

Android 奇怪的测试 fragment