This question already has answers here:
How do I find the caller of a method using stacktrace or reflection?
                                
                                    (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