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

我想写一个内部的代码来打印哪个方法/类已经调用了它。

(我的假设是我不能改变任何东西,但我的方法..)

其他编程语言如何?

编辑:谢谢你们,那么JavaScript呢? 蟒蛇? C ++?


这是Java特有的。

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

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

例:

public void methodThatPrintsCaller() {
    StackTraceElement elem = Thread.currentThread.getStackTrace()[2];
    System.out.println(elem);

    // rest of you code
}

如果你想要做的就是打印堆栈跟踪并寻找课程,请使用

Thread.dumpStack();

查看API文档。


贾斯汀的一般情况下降了; 我想提一下这个小窍门所展示的两个特例:

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;
    }
}

这打印:

SomeRefiedGeneric.compare() called by: SomeReifiedGeneric.compare(WhoCalledMe.java:1)
somePrivateMethod() called by: WhoCalledMe.access$0(WhoCalledMe.java:14)

即使第一个从main()直接调用,第二个从SomeInnerClass.someInnerMethod() 。 这两种情况是两种方法之间存在透明的呼叫。

  • 在第一种情况下,这是因为我们将桥接方法调用为通用方法,由编译器添加以确保SomeReifiedGeneric可以用作原始类型。
  • 在第二种情况下,这是因为我们正在从内部类中调用WhoCalledMe的私人成员。 要做到这一点,编译器会添加一个合成方法作为中介来覆盖可见性问题。
  • 链接地址: http://www.djcxy.com/p/82413.html

    上一篇: Java or any other language: Which method/class invoked mine?

    下一篇: How to print out a full stack trace?