因此,给出以下代码:
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 的工具。 。步骤如下:
- 在您的 Agent 类中,实现 java.lang.instrument.ClassFileTransformer 。
- 在您的 agentmain() 或 premain() 方法中,request转变类。
- 当您接到transform的电话时方法中,您可以使用 Class.getInterfaces() 检查类是否实现了 MyInterface。
- (可选)您可以检查其 Class.getEnendingClass() 是否是您在其中编写/找到此代码的类。
- 如果类通过了这些健全性检查,则创建一个 ClassWriter,将日志记录添加到 getSomethingElse() 方法。 ASMifier当尝试弄清楚如何生成您想要的代码时有很大帮助。
然后,在生产中,这些代码将不存在。在开发过程中,您可以在环境中添加 Java 代理,这将启用调试。
同样,几乎肯定有更好的方法来做到这一点,但是使用仪器有充分的理由,这是一个关于这样做的迷你速成类(class)。
希望有帮助,
关于java - 检测 Java 匿名内部类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9229239/