从Reflection Java获取类类型

时间:2015-07-19 18:44:50

标签: java reflection

当我调用类中的方法时,该方法将使用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”。

1 个答案:

答案 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()的调用并不便宜,因此请注意,您可能会产生一些运行时成本。此模式通常用于记录,以记录触发记录调用的代码段。