This question already has answers here:
How do I find the caller of a method using stacktrace or reflection?
(12个答案)
4年前关闭。
当我在类中调用方法时,该方法将使用
假设我有这个课:
致电者:
然后程序将打印出“ Bar”。
打印:
(12个答案)
4年前关闭。
当我在类中调用方法时,该方法将使用
java.lang.Class
获得调用它的sun.reflect.Reflection.getCallerClass(2)
。这不是我想要的。我希望Reflection返回调用它的类Object(即,如果我从Bar
类调用该方法,则Reflection.getCallerClass()
返回类型为Bar
的对象)假设我有这个课:
public class Foo {
public static void printOutCallerObject() {
System.out.println(classTypeThatCalledOnMethod);
}
}
致电者:
public class Bar {
public static void main(String[] args) {
Foo.printOutCallerObject();
}
}
然后程序将打印出“ Bar”。
最佳答案
这是如何获取调用类的快速演示-无法获取调用对象,除非将其传递给方法,因为它不在堆栈中。
public class ReflectDemo {
public static class Foo {
public static void printOutCallerObject() {
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
// trace[0] is Thread.getStackTrace()
// trace[1] is Foo.printOutCallerObject()
// trace[2] is the caller of printOutCallerObject()
System.out.println(trace[2].getClassName());
}
}
public static class Bar {
public static void barMain() {
Foo.printOutCallerObject();
}
}
public static void main(String[] args) {
Foo.printOutCallerObject();
Bar.barMain();
}
}
打印:
ReflectDemo
ReflectDemo$Bar
Foo.printOutCallerObject();
将打印出任何代码调用的类。调用Thread.currentThread().getStackTrace()
并不便宜,因此请注意,您可能会花费一些运行时成本。此模式通常用于日志记录,以记录哪段代码触发了日志记录调用。10-02 09:46