我想在我的方法内部编写一段代码,打印哪个方法/类调用了它。
(我的假设是,除了我的方法之外,我什么也不能改变。)
其他编程语言怎么样?
编辑:谢谢各位,JavaScript怎么样?python?C++?
发布于 2010-08-12 13:33:17
这是Java特有的。
您可以使用Thread.currentThread().getStackTrace()。这将返回一个StackTraceElements数组。
数组中的第二个元素是调用方法。
示例:
public void methodThatPrintsCaller() {
StackTraceElement elem = Thread.currentThread.getStackTrace()[2];
System.out.println(elem);
// rest of you code
}发布于 2010-08-12 13:30:49
如果只想打印堆栈跟踪并搜索类,请使用
Thread.dumpStack();见API文档。
发布于 2010-08-12 15:47:41
Justin的一般情况已经结束;我想提到这段片段所演示的两种特殊情况:
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()。这是两个在这两种方法之间发出透明呼吁的情况。
https://stackoverflow.com/questions/3468101
复制相似问题