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()
。 这两种情况是两种方法之间存在透明的呼叫。
上一篇: Java or any other language: Which method/class invoked mine?