我想在我的方法内部编写一个代码,用于打印哪个方法/类调用它。
(我的假设是我不能改变任何东西,除了我的方法..)
其他编程语言怎么样?
编辑:谢谢大家,JavaScript怎么样?蟒蛇? C ++?
答案 0 :(得分:19)
这是Java特有的。
您可以使用Thread.currentThread().
getStackTrace()
。这将返回StackTraceElements
的数组。
数组中的第二个元素是调用方法。
示例:
public void methodThatPrintsCaller() {
StackTraceElement elem = Thread.currentThread.getStackTrace()[2];
System.out.println(elem);
// rest of you code
}
答案 1 :(得分:4)
答案 2 :(得分:4)
贾斯汀的情况有所下降;我想提一下这个snippit所展示的两个特例:
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()
。这两种情况在两种方法之间进行了透明调用。
答案 3 :(得分:3)
方法调用的序列位于堆栈中。这就是你获得筹码的方式:Get current stack trace in Java然后获得前一个项目。
答案 4 :(得分:1)
由于您询问了其他语言,Tcl为您提供了一个命令(info level),可以让您检查调用堆栈。例如,[info level -1]
返回当前过程的调用者,以及用于调用当前过程的参数。
答案 5 :(得分:1)
在Python中,您使用inspect模块。 获取函数的名称和文件名很简单,如下例所示。
获得功能本身就更有效。我认为您可以使用__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()
答案 6 :(得分:0)
是的,这是可能的。
答案 7 :(得分:0)
在Python中,您应该使用traceback或inspect模块。这些模块将保护您免受解释器的实现细节的影响,即使在今天(例如IronPython,Jython)也可能有所不同,并且将来可能会发生更多变化。然而,这些模块在今天使用标准Python解释器执行此操作的方式是使用sys._getframe()。特别是,sys._getframe(1).f_code.co_name提供了您想要的信息。