当我调用类中的方法时,该方法将使用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”。
答案 0 :(得分:2)
以下是如何获取调用类的快速演示 - 除非将其传递给方法,否则无法获取调用对象,因为它不在堆栈中
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()
的调用并不便宜,因此请注意,您可能会产生一些运行时成本。此模式通常用于记录,以记录触发记录调用的代码段。