我想跟踪Foo
类中所有方法的调用。另一个类会覆盖Foo
的所有方法,就像这样...
@Override
public void blah() {
System.out.println("blah()");
super.blah();
}
......会做 - 但是我真的需要覆盖它们(超过100种方法)吗?
这可以通过更智能的方式完成,例如使用反射吗?
编辑:澄清 - Foo
是本机库的JNI接口,我需要这个来保存对文件的所有调用,以生成完全与我在Java中完成的C代码。
答案 0 :(得分:5)
答案 1 :(得分:2)
对于调试,如果您使用的是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/
答案 2 :(得分:1)
首先,如果一个类中有100个方法,那么它就是重构的主要候选者。
然后 - 您可以围绕对象创建代理(使用CGLIB或javassist),并且每当调用方法时,都会报告调用。
答案 3 :(得分:1)
如果您只需要这个用于调试/开发目的而不是最终系统,则可以使用Eclipse分析。 Eclipse概要分析允许您定义在不同时间执行的探测(例如,在方法开始时),这些探测允许您在访问方法名称和参数值等内容时执行任意Java代码。您可以定义各种过滤器,以便仅执行当前所需的探测。我不确切知道它是如何工作的,但我认为类文件是经过检测的,所以运行时的影响应该相对较低。
另一方面,如果您需要在生产代码中使用此功能,我会投票支持AOP - 正如nanda所建议的那样。