首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java 8中获取调用者方法的有效方法?

在Java 8中获取调用者方法的有效方法?
EN

Stack Overflow用户
提问于 2020-08-14 12:22:53
回答 2查看 2.1K关注 0票数 1

这就是我想要实现的:如果有一个方法a()调用b()方法,我想知道是谁调用了method b()

代码语言:javascript
复制
public void a(){
  b();//but it is not necessarily in the same class
}

public void b(){
  String method = getCallerMethod();//returns 'a'
}

现在,可以使用Java在9+中有效地实现这一点。在Java8中,我可以使用Thread.currentThread().getStackTrace()new Exception().getStackTrace(),但这两种方法都非常慢。我不需要整个堆栈跟踪,我只需要堆栈跟踪中的前一个框架,只需要该框架中的方法名称(可能还需要类名)。

有办法在Java 8中有效地实现这一点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-15 00:05:18

  1. 在JDK 8中,有内部没有文档的API,它提供对单个堆栈跟踪元素的访问,而不解码整个堆栈跟踪: SharedSecrets.getJavaLangAccess().getStackTraceDepth(e) SharedSecrets.getJavaLangAccess().getStackTraceElement(e,指数 它有助于避免大量解码堆栈跟踪的开销,但仍然需要收集整个跟踪。详情请参见这个答案
  2. 更快的方法是JVM TI GetStackTrace函数。它的start_depthmax_frame_count参数只允许获得堆栈跟踪的选定部分。 这种方法的缺点是它需要一个本机库。 我有一个使用示例GetStackTrace,它几乎可以满足您的需要:StackFrame.getLocation(depth)方法在给定深度只返回一个堆栈帧。
  3. 在只需要调用类的情况下(没有确切的方法),快速、标准和可移植的解决方案是 MethodHandles.lookup().lookupClass()
  4. 最后,如果只需要调用方方法,另一种解决方案是使用字节码仪表查找调用方法a的所有invoke*字节码,并重写它们以调用方法a_with_caller(String callerMethod),其中callerMethod参数是从正在检测的方法派生的插装时间常数。
票数 7
EN

Stack Overflow用户

发布于 2020-08-14 12:35:58

您可以创建am异常并使用fillInStacktrace(),然后printStacktrace()并粘贴结果。

它的效率可能不是很高,但我不明白如果它只用于调试的话,为什么要这样做。

我没有在我的电脑上,所以我没有试着编译它。

代码语言:javascript
复制
try (StringWriter wr = new StringWriter(); 
     PrintWriter pw = new PrintWriter(wr)) {
    new Exception().fillInStacktrace().printStacktrace(pw);
    try (Scanner sc = new Scanner(wr.toString())) {
        int atFound = 0;
        while (sc.hasNextLine()) {
            String line = sc.nextLine();
            if (line.contains("at")) {
                atFound++;
            } 
            if (atFound == 2) {
                // this should be the caller, first one is this method
            } 
        } 
   } 
} 
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63412684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档