2010-01-31 64 views
2

我有一个类层次结构如下所示:(=>的意思是 “是的子类”)Java反射:查找一个子类的字段

anonymous instance class => abstract class => generic abstract class 

或更简洁地:

C => B => A 

当执行,“C”称之为“A”的方法之一。在“A”中的该方法中,我想使用反射来查找在类“B”中定义的对象的受保护字段。 (所以这些是“C”和“B”可以看到的字段,但不是“A”。)

我该如何用Java反射来做到这一点?如果我在A & B或B & C之间添加某些东西,我该如何面向未来?

+0

只是所以我相信我明白 - 你想调用A的子类的方法,对吧?即B从A继承,并且你希望A调用B上的方法? – aperkins 2010-01-31 15:54:02

+0

好吧,具体而言,我想动态地访问在A中定义的方法B上定义的字段,但该类的声明类型是C. – roufamatic 2010-01-31 16:13:10

+0

我不明白你想要面向未来,如果反射总是引用与B?类相同,B在编译时是否已知?如果你的继承链中的哪个类不是它的位置,你如何辨别它是哪个类? – josefx 2010-01-31 16:14:43

回答

12

您必须在对象类的继承层次结构中的每个类上重复使用getDeclaredFields()(通过getSuperclass())。

但是,您的计划听起来像是对继承概念的恶意违反。预防未来的最佳方式是完全避免这种事情。什么你试图做的,你认为需要这样的反射shenanigans?

+0

+1因为您的第二段 - 我完全同意。 – aperkins 2010-01-31 16:37:23

+9

首先我很生气。然后,我试图解释我的目的是什么,但不能没有讨论整个问题。然后我生气了。然后,当我让儿子入睡时,我发现我的问题可以通过让超类创建子对象并将它们存储在本地而没有反射而更加干净地解决。感谢裤子的踢。 – roufamatic 2010-02-01 04:44:32

1
Field[] fields = getClass().getSuperclass().getDeclaredFields(); 

然后重复这些字段并得到你想要的。

如果您的层次增长,您可以将上述变换为递归调用getSuperclass()(同时getSuperclass() != Object.class),从而收集所有超类的所有字段。

+1

好吧,只是为了确保我不疯狂 - 我完全误解了他的问题吗?或者他实际上是在问一个父类如何在子类中找到方法?因为如果他在父类上询问方法时,你的方法会起作用,但我读到他正在问相反的问题。 – aperkins 2010-01-31 16:01:11

+0

@ aperkins,这应该也适用于子类的方法,因为getClass()将在运行时返回对象的实际类(A),然后getSuperclass()将返回类(B),但它不是面向未来。 – josefx 2010-01-31 16:07:03

+0

是的,我意识到后,我想到了。今天早上还太早,冬天的残骸正在杀死我的大脑。至少,这是我的借口,我坚持这一点。 :)我适当地更新了我的答案。感谢您的回应。 – aperkins 2010-01-31 16:10:14

1

据我所知,没有办法在Java中反思地了解你的“子类”。难道一个更好的解决方案是创建一个B必须实现的抽象方法,并调用它吗?

public class A { 
    //other stuff here 
    protected void abstract mySubMethod(); 
    //other stuff here 
} 

编辑: 如果我误解了你的问题,你真的想知道关于父类,然后是:getDeclaredFields()是使用,如其他海报中提到的正确方法反光。

附加编辑: 我不想让修改此答案,但... 在一般情况下,如果你试图给访问父类中,“正确”和“面向未来”的方式做这是为了创建抽象方法,这些抽象方法是getter或setters(如果需要,甚至更复杂),然后让孩子们尊重或不尊重,并在适当的时候作出回应。

话虽这么说,你可以做一些像其他人说:

getClass().getParentClass().getDeclaredFields() 

然而,这只是如果C总是直接从B.思考继承工作是由它的本质来说,棘手和具体。我必须在我正在进行的一个项目上做很多工作(不要问,相信我,你不想知道),并尽可能避免它。除非A有充分理由需要受保护的字段,并且正在发现关于它们的信息,否则您可能想要使用抽象方法。我也会提出,你可以用一种抽象方法解决另一个问题,但它可能有点困难。