java set / get指定类的静态继承字段

时间:2013-07-19 16:07:17

标签: java static field inherited

我正处于以下情况:

public class SuperClass
{
        public static Object superClassStaticField;
}

public class ChildClass extends SuperClass
{
... some methods and fields
}

我有一个看起来像这样的方法:

...modifiers... void action(Class <? extends SuperClass> cls)
{
...
}

我想要覆盖所有元素白色反射,包括超类静态字段,我(后来在ChildClass中)初始化,但看起来这里有一些逻辑在反射中失败:

superClassStaticField位于超类中,所以如果我尝试使用:

cls.getClass().get[Declared]Field("superClassStaticField");

我将获得java.lang.NoSuchFieldException

所以我必须达到SuperClass的麻烦:

SuperClass.class.getDeclaredField("superClassStaticField").get(null);

将成功运行,但如果有多个ChildClass在同一个运行时工作,我的程序会变得疯狂。我认为beacuse所有方法都达到相同的Object,它在SuperClass中声明。

但是我如何才能达到实际给定的类静态字段?

我试过了:

SuperClass.class.getDeclaredField("superClassStaticField").get(cls);

但结果是一样的。

我怎样才能达到它?

编辑: 我想现在只获取/设置静态字段,创建一个新实例是不安全的,(酸它有空构造函数?并且什么都不会修改?)

2 个答案:

答案 0 :(得分:6)

  

但是我如何才能达到实际给定的类静态字段?

只有一个静态字段。每个子类最终不会有一个静态字段。听起来你需要采取不同的方法。我们不能就这种方法应该给你很多建议,因为我们不知道你想要实现什么。也许Map<Class, Object>就是你所追求的?

答案 1 :(得分:1)

首先,静态字段属于定义它们的实际类;它们可通过来自子类的引用的反射来访问。也就是说,使用反射:

SuperClass.field // OK - the field is declared on SuperClass
SubClass.field // Not found - the field is not declared on SubClass

你可以找到字段虽然使用反射通过爬上层次结构(反复)尝试在你正在检查的类的超类上找到它:

clz.getSuperclass().getField("superClassStaticField")

根据层次结构的深度,您可能需要经历多个超类。

最后,因为该字段属于超类,并且所有子类只有一个超类,所有子类都将使用相同的超类字段。 / p>