2010-07-29 80 views
0

我想跟踪Foo类中所有方法的调用。这将覆盖从Foo这样所有的方法另一类...如何跟踪一个类的所有方法调用?

@Override 
public void blah() { 
    System.out.println("blah()"); 
    super.blah(); 
} 

...会做 - 但我真的需要重写所有这些(超过100方法)?

这可以用一些更聪明的方式完成,例如使用反射?

编辑:澄清 - Foo是一个本地库的JNI接口,我需要这个将所有调用保存到一个文件中,以生成C代码,这些代码完全符合我从Java所做的。

+2

我不明白你为什么不使用探查器?他们发起方法调用。或者“跟踪”是什么意思? – InsertNickHere 2010-07-29 10:44:08

回答

1

首先,如果您在一个类中有100个方法,那么它是重构的主要候选者。然后 - 您可以在对象周围创建代理(使用CGLIB或javassist),并且每当调用方法时,都会报告调用。

+0

这是一个有很多本地方法的类。我无法更改其API。 – mik01aj 2010-07-29 11:08:47

1

出于调试,如果您正在使用IBM JVM,您可以使用方法跟踪(可禁用某些追踪方法的JIT优化):

以文本形式打印输出流:

-Xtrace:iprint=mt,methods{com/my/package/ClassName.methodName} 

或二进制格式文件(流程与内置com.ibm.jvm.format.TraceFormat应用程序):

-Xtrace:maximal=mt,methods{com/my/package/ClassName.methodName},output=trace.dat 

全部细节的Java诊断指南: http://www.ibm.com/developerworks/java/jdk/diagnosis/

1

如果你只需要这个用于调试/开发目的,而不是在最终系统中,你可以使用Eclipse分析。 Eclipse概要分析允许您定义在不同时间执行的探针(例如,在方法的开始处),这些探针允许您在访问诸如方法名称和参数值等内容的同时执行任意Java代码。您可以定义各种过滤器,以便仅在当前需要的位置执行探测。我不知道它究竟是如何工作的,但我认为这些类文件是经过检测的,所以运行时影响应该相对较低。

另一方面,如果你需要这样的产品代码,我会投票给AOP--就像nanda提出的一样。

相关问题