假设我有一个方法 classA.methodA()
及其调用 classB.methodB()
。现在,在 classB.methodB()
中,有什么方法可以知道它被 classA
调用(无需传递任何显式信息)。我知道这个信息存在于 Java 运行时中。我的问题是如何获取被调用方法的类名?
让它更明显
ClassA{
methodA(){
ClassB b = new ClassB();
b.methodB();
}
}
ClassB{
methodB(){
// Code to find that its being called by ClassA
}
}
最佳答案
您可以使用 Thread.currentThread().getStackTrace()
获取堆栈跟踪,然后遍历它以查找堆栈中哪个方法在您的方法之上。
例如(这里完全由堆栈组成),你可能有这样一个堆栈:
main()
|- Foo()
|- Bar()
|- MyFunction()
|- getStackTrace()
|- captureJavaThreadStack(...)
从底部开始迭代,直到您点击 getStackTrace()
方法。然后您知道调用方法是从该位置向上的两个方法,即 MyFunction()
调用了 getStackTrace()
,这意味着 MyFunction()
将始终位于 getStackTrace()
之上,并且任何调用的 MyFunction()
都将位于其之上。
您可以在 StackTraceElement
类上使用 getClassName()
方法从选定的堆栈跟踪元素中提取类名。
文档:
http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#getStackTrace%28%29
http://docs.oracle.com/javase/6/docs/api/java/lang/StackTraceElement.html
关于java - 有没有办法知道调用者类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8340785/