【问题标题】:How to trace all method invocations from a class?如何跟踪类中的所有方法调用?
【发布时间】:2011-03-22 15:32:10
【问题描述】:

我想跟踪来自Foo 类的所有方法调用。另一个类会像这样覆盖Foo 中的所有方法...

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

...会做 - 但我真的需要全部覆盖它们(超过 100 种方法)吗?

这可以通过更智能的方式完成吗,例如使用反射?

编辑:澄清一下 - Foo 是本地库的 JNI 接口,我需要它来保存所有对文件的调用,以生成与 Java 完全相同的 C 代码。

【问题讨论】:

  • 我不明白你为什么不使用分析器?他们计算方法调用。或者您所说的“跟踪”是什么意思?

标签: java reflection code-generation


【解决方案1】:

AOP (Aspect Oriented Programming)

例如可以使用AJDT,看看它的demo

【讨论】:

    【解决方案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/

    【讨论】:

      【解决方案3】:

      首先,如果一个类中有 100 个方法,那么它就是重构的主要候选对象。

      然后 - 您可以在对象周围创建一个代理(使用 CGLIB 或 javassist),并且每当调用方法时,报告调用。

      【讨论】:

      • 这是一个有很多原生方法的类。我无法更改它的 API。
      【解决方案4】:

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

      另一方面,如果您在生产代码中需要这个,我会投票支持 AOP——就像 nanda 提议的那样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-10
        • 1970-01-01
        • 2015-06-05
        • 2011-10-16
        • 2021-08-07
        相关资源
        最近更新 更多