我正处于以下情况:
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);
但结果是一样的。
我怎样才能达到它?
编辑: 我想现在只获取/设置静态字段,创建一个新实例是不安全的,(酸它有空构造函数?并且什么都不会修改?)
答案 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>