使用反射实现this.class的正确方法

时间:2014-10-16 15:28:19

标签: java reflection

假设我在包Foo中有一个类my.package,其中包含一些静态字段。

我想使用反射来获取那些静态字段的值。

我知道我可以写my.package.Foo.class.getDeclaredField(...但这并不令人满意,因为我正在对类和包名称进行硬编码。

我想使用this.class.getDeclaredField(...,但即使从非静态成员函数中调用,这在Java中也是无效的。

有办法吗?

2 个答案:

答案 0 :(得分:3)

每个类都继承实例方法Object#getClass()。调用它来获取实例的相应Class对象。

我不知道为什么你会在Foo内执行此操作,因为Foo已知道其static字段,并且您可以直接在编译时访问它们。

答案 1 :(得分:0)

非静态地,您可以使用this.getClass()获取当前类,如@sotirios-delimanolis所述。

静态地,你可以这样做,虽然它有点难看:

public static Class<?> getCurrentClassStatic() {
    try {
        return Class.forName(new Throwable().getStackTrace()[0].getClassName());
    } catch (ClassNotFoundException e) {
        return null; //Shouldn't happen...
    }
}