Javareflection:查找子类的字段
我有一个类层次结构,如下所示:(=>表示“是”的子类“)
anonymous instance class => abstract class => generic abstract class
或者更简洁:
C => B => A
执行时,“C”调用“A”方法之一。 在“A”中的该方法中,我想使用reflection来查找在“B”类中定义的对象的受保护字段。 (所以这些是“C”和“B”可以看到的字段,但不是“A”。)
我如何使用Javareflection做到这一点? 如果我在A&B或B&C之间添加一些东西,我怎么能面向未来呢?
您必须在对象类的inheritance层次结构中的每个类上重复使用getDeclaredFields()
(通过getSuperclass()
)。
但是,你的计划听起来像是一个令人讨厌的违反inheritance概念的行为。 面向未来的最佳方法是完全避免这种事情。 你想要做什么,你认为需要这样的反思恶作剧?
据我所知,没有办法反过来了解Java中的“子类”。 难道更好的解决方案是在A上创建一个B必须实现的抽象方法,而不是调用它吗?
public class A { //other stuff here protected void abstract mySubMethod(); //other stuff here }
编辑:如果我误解了你的问题,并且你真的想知道父类,那么是:getDeclaredFields()是正确的reflection方法,如其他海报所述。
附加编辑:我不想继续修改这个答案,但是……一般来说,如果你试图访问父类,那么“正确”和“面向未来”的方法是创建抽象方法如果有必要,可以让孩子尊重或尊重他们,并在适当时做出回应。
话虽这么说,你可以做其他人说过的话:
getClass().getParentClass().getDeclaredFields()
但是,只有在C总是直接从Binheritance的情况下才会有效。反思就是它本质上是棘手而具体的。 我必须在我正在进行的项目上做很多事情(不要问,相信我,你不想知道),我尽可能避免它。 除非A有充分的理由需要受保护的字段并且它正在发现有关它们的信息,否则您可能希望使用抽象方法。 我还要提出,你很可能用抽象方法解决了另一个问题,但这可能有点困难。
Field[] fields = getClass().getSuperclass().getDeclaredFields();
然后迭代这些字段并获得您想要的字段。
如果您的层次结构增长,您可以将上面的内容转换为对getSuperclass()
的递归调用(而getSuperclass() != Object.class
),从而收集所有超类的所有字段。