代码之家  ›  专栏  ›  技术社区  ›  roufamatic

Java反射:查找子类的字段

  •  3
  • roufamatic  · 技术社区  · 14 年前

    我有一个这样的类层次结构:(=>表示“是的子类”)。

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

    或者更简洁地说:

    C => B => A
    

    执行时,“c”调用“a”的方法之一。在“a”中的方法中,我希望使用反射来查找在类“b”中定义的对象的受保护字段。(这些字段“c”和“b”可以看到,但不是“a”。)

    我如何用Java反射来实现呢?如果我在A&B或B&C之间添加了一些内容,我该如何证明它?

    3 回复  |  直到 14 年前
        1
  •  12
  •   Michael Borgwardt    14 年前

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

    然而,你的计划听起来像是对继承概念的严重侵犯。未来校对的最好方法是完全避免这种事情。什么 你想这样做,你认为需要这种反省的恶作剧吗?

        2
  •  1
  •   aperkins    14 年前

    据我所知,没有办法了解爪哇的“儿童班”。一个更好的解决方案是在a上创建一个抽象方法,而b必须实现这个抽象方法,然后调用它吗?

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

    编辑: 如果我误解了您的问题,并且您实际上想要了解父类,那么是的:getDeclaredFields()是要使用的正确的反射方法,如其他海报所述。

    附加编辑: 我不想一直修改这个答案,但是… 一般来说,如果您试图授予对父类的访问权,那么做到这一点的“正确”和“未来证明”方法是创建抽象方法,这些方法是getter或setter(或者更复杂,如果必要的话),然后让子类尊重这些方法或不尊重这些方法,并做出适当的响应。

    有人说,你 可以 像别人说的那样做:

    getClass().getParentClass().getDeclaredFields()
    

    然而,只有当C总是直接从B继承的时候,这才有效。从本质上讲,反射是非常复杂和具体的。我必须在一个我正在做的项目上做很多事情(不要问,相信我,你不想知道),我尽量避免。除非有充分的理由让a需要受保护的字段,并且它正在发现有关这些字段的信息,否则您可能希望使用抽象方法。我还将提交,您可能可以用抽象方法解决另一个问题,但这可能会有点困难。

        3
  •  1
  •   Bozho Michał Mech    14 年前
    Field[] fields = getClass().getSuperclass().getDeclaredFields();
    

    然后迭代这些字段,得到您想要的字段。

    如果层次结构增长,可以将上面的内容转换为对 getSuperclass() (同时) getSuperclass() != Object.class 从而收集所有超类的所有字段。