首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java或任何其他语言:哪个方法/类调用了我的?

Java或任何其他语言:哪个方法/类调用了我的?
EN

Stack Overflow用户
提问于 2010-08-12 13:25:34
回答 8查看 761关注 0票数 13

我想在我的方法内部编写一段代码,打印哪个方法/类调用了它。

(我的假设是,除了我的方法之外,我什么也不能改变。)

其他编程语言怎么样?

编辑:谢谢各位,JavaScript怎么样?python?C++?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-08-12 13:33:17

这是Java特有的。

您可以使用Thread.currentThread().getStackTrace()。这将返回一个StackTraceElements数组。

数组中的第二个元素是调用方法。

示例:

代码语言:javascript
复制
public void methodThatPrintsCaller() {
    StackTraceElement elem = Thread.currentThread.getStackTrace()[2];
    System.out.println(elem);

    // rest of you code
}
票数 20
EN

Stack Overflow用户

发布于 2010-08-12 13:30:49

如果只想打印堆栈跟踪并搜索类,请使用

代码语言:javascript
复制
Thread.dumpStack();

API文档

票数 4
EN

Stack Overflow用户

发布于 2010-08-12 15:47:41

Justin的一般情况已经结束;我想提到这段片段所演示的两种特殊情况:

代码语言:javascript
复制
import java.util.Comparator;

public class WhoCalledMe {

    public static void main(String[] args) {
        ((Comparator)(new SomeReifiedGeneric())).compare(null, null);
        new WhoCalledMe().new SomeInnerClass().someInnerMethod();
    }

    public static StackTraceElement getCaller() {
        //since it's a library function we use 3 instead of 2 to ignore ourself
        return Thread.currentThread().getStackTrace()[3];
    }

    private void somePrivateMethod() {
        System.out.println("somePrivateMethod() called by: " + WhoCalledMe.getCaller());
    }

    private class SomeInnerClass {
        public void someInnerMethod() {
            somePrivateMethod();
        }
    }
}

class SomeReifiedGeneric implements Comparator<SomeReifiedGeneric> {
    public int compare(SomeReifiedGeneric o1, SomeReifiedGeneric o2) {
        System.out.println("SomeRefiedGeneric.compare() called by: " + WhoCalledMe.getCaller());
        return 0;
    }
}

这些指纹:

代码语言:javascript
复制
SomeRefiedGeneric.compare() called by: SomeReifiedGeneric.compare(WhoCalledMe.java:1)
somePrivateMethod() called by: WhoCalledMe.access$0(WhoCalledMe.java:14)

尽管第一种被称为“直接”来自main(),第二种被称为“直接”来自SomeInnerClass.someInnerMethod()。这是两个在这两种方法之间发出透明呼吁的情况。

  • 在第一种情况下,这是因为我们将桥梁法调用到一个泛型方法,由编译器添加,以确保SomeReifiedGeneric可以用作原始类型。
  • 在第二种情况下,这是因为我们从内部类调用WhoCalledMe的私有成员。为了实现这一点,编译器添加了一个合成方法,作为中间的方法来覆盖可见性问题。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3468101

复制
相关文章

相似问题

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