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 ),从而收集所有超类的所有字段。