如何使用AspectJ打印方法的调用层次结构?

时间:2014-06-15 18:18:12

标签: java aspectj

我的目标是在一个大型项目中找到一些特定的API方法,以及以何种方式调用。

e.g。如果有两种方法,请说com.pack.API.x()com.pack.API.y()

我想知道它们何时被调用,调用时的调用层次结构是什么以及使用了哪些参数?

我正在使用AspectJ,但它只能告诉我调用方法的位置,而不是完整的调用层次结构。这是我写的一个示例切入点和建议:

import org.aspectj.lang.Signature;

public aspect TraceXCut {

pointcut xCall() : (call(* com.pack.API.x(..)) && !cflow(within(TraceXCut)));

before() : xCall() {
    Signature sig = thisJoinPointStaticPart.getSignature();
    String line = "" + thisJoinPointStaticPart.getSourceLocation().getLine();
    String sourceName = thisJoinPointStaticPart.getSourceLocation().getWithinType().getCanonicalName();
    System.out.println("Call from " +  sourceName + " line " + line
                       + " to " +sig.getDeclaringTypeName() + "." + sig.getName());
}

}

1 个答案:

答案 0 :(得分:0)

在方法开始时,为什么不使用类似的东西:

new Exception().printStackTrace();

如果您实际上没有抛出异常,您的代码将继续正常运行。至于参数,你也可以打印它们。