代码之家  ›  专栏  ›  技术社区  ›  mik01aj

如何从类中跟踪所有方法调用?

  •  0
  • mik01aj  · 技术社区  · 14 年前

    我想从 Foo 班级。另一个类将重写 这样地。。。

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

    …可以-但是我真的需要覆盖它们吗(超过100个方法)?

    这能以更聪明的方式完成吗,例如,使用反射?

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

    4 回复  |  直到 14 年前
        1
  •  1
  •   Bozho    14 年前

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

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

        2
  •  5
  •   nanda    14 年前

    AOP(AOP) Aspect Oriented Programming )

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

        3
  •  1
  •   Mike Tunnicliffe    14 年前

    用于调试 ,如果您使用的是IBMJVM,则可以使用方法跟踪(可能会禁用跟踪方法的某些JIT优化):

    以文本形式打印到输出流:

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

    或以二进制格式(使用内置的com.ibm.jvm.format.traceformat app处理)文件:

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

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

        4
  •  1
  •   musiKk    14 年前

    如果您只需要将其用于调试/dev目的,而不是在最终系统中,那么可以使用Eclipse分析。Eclipse Frrices允许您定义在不同时间(例如在方法的开始)执行的探针,这些探针允许您在访问诸如方法名称和参数值之类的东西时执行任意Java代码。您可以定义各种过滤器,以便仅在当前需要时执行探测。我不知道它是如何工作的,但是我假设类文件是被检测的,所以运行时的影响应该相对较低。

    另一方面,如果您在生产代码中需要它,我将投票支持AOP——正如Nanda建议的那样。