我想在我的方法内部编写一段代码,以打印出调用它的方法/类。
(我的假设是除了我的方法,我不能改变任何东西...)
其他编程语言呢?
编辑:谢谢大家,JavaScript? python? C++呢?
我想在我的方法内部编写一段代码,以打印出调用它的方法/类。
(我的假设是除了我的方法,我不能改变任何东西...)
其他编程语言呢?
编辑:谢谢大家,JavaScript? python? C++呢?
这是针对Java的特定方法。
你可以使用Thread.currentThread().
getStackTrace()
,这将返回一个包含StackTraceElements
的数组。
数组中的第二个元素将是调用该方法的元素。
例如:
public void methodThatPrintsCaller() {
StackTraceElement elem = Thread.currentThread.getStackTrace()[2];
System.out.println(elem);
// rest of you code
}
arr[2]
或者第二个元素。(技术上来讲它是第三个元素)(但是,那么第零个元素该怎么叫呢?) - jjnguyJustin已经掌握了一般情况;我想提到这个片段演示的两个特殊情况:
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()
调用的。这两种情况都存在在两个方法之间进行透明调用的情况。
__import__
函数导入调用者的模块。但是您必须将文件名转换为有效的模块名称。import inspect
def find_caller():
caller_frame = inspect.currentframe().f_back
print "Called by function:", caller_frame.f_code.co_name
print "In file :", caller_frame.f_code.co_filename
#Alternative, probably more portable way
#print inspect.getframeinfo(caller_frame)
def foo():
find_caller()
foo()
既然你问到其他语言,Tcl 提供了一个命令(info level),它可以让你检查调用堆栈。例如,[info level -1]
返回当前过程的调用者以及用于调用当前过程的参数。