我想动态地构建调用图,从任意方法调用开始,或者从运行的JVM本身中使用新线程开始构建调用图.(这个软件将成为负载测试另一个消耗调用图的软件的测试工具)
我知道有一些SPI接口,但看起来你需要用它们运行-javaagent标志.我想直接在VM本身访问它.
理想情况下,我想获得每个方法调用的入口和出口的回调,该方法调用的参数以及该方法中的时间.显然在单个线程内.
我知道AOP可能会这样做,但我只是想知道JDK中是否有工具可以让我捕获它.
这就是我想要实现的:如果有一个方法a()
调用 method b()
,我想知道谁调用了 method b()
。
public void a(){
b();//but it is not necessarily in the same class
}
public void b(){
String method = getCallerMethod();//returns 'a'
}
Run Code Online (Sandbox Code Playgroud)
现在,这可以在 Java 9+ 中使用 API 高效地实现StackWalker
。在 Java 8 中,我可以使用Thread.currentThread().getStackTrace()
or new Exception().getStackTrace()
,但这两种方法都非常慢。我不需要整个堆栈跟踪,我只需要堆栈跟踪中的前一帧,并且只需要该帧中的方法名称(可能还有类名称)。
有没有办法在 Java 8 中有效地实现这一点?