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

Java 如何使用AspectJ打印方法的调用层次结构?,java,aspectj,Java,Aspectj,我的目标是在一个大项目中找出调用几个特定API方法的地方以及调用方式 e、 g.给出两种方法,分别是com.pack.API.x()和com.pack.API.y() 我想知道何时调用它们,调用时的调用层次结构是什么,使用了哪些参数 我使用的是AspectJ,但它只能告诉我调用方法的位置,而不能告诉我完整的调用层次结构。以下是我写的示例切入点和建议: import org.aspectj.lang.Signature; public aspect TraceXCut { pointcut x

我的目标是在一个大项目中找出调用几个特定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());
}

}

在方法开始时,为什么不使用以下方法:

new Exception().printStackTrace();

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

谢谢,简单有效:)