通过反射获取子类字段

时间:2013-03-11 08:45:13

标签: java reflection

我有2个课程:B扩展A

我在课程getDeclaratedFields()上使用B,但我没有从“A”类中获取字段。

我怎样才能得到它们?

2 个答案:

答案 0 :(得分:1)

getDeclaredFields()返回由类声明的字段,而不是超类。

  

返回反映声明的所有字段的Field对象数组   由此Class对象表示的类或接口。这个   包括公共,受保护,默认(包)访问和私有   字段,但不包括继承的字段。

使用getFields方法检索由类和超类声明的字段。

  

具体来说,如果此Class对象表示一个类,则此方法   返回此类及其所有超类的公共字段

阅读Java Class了解详情。

答案 1 :(得分:0)

您应该使用Class#getSuperclass()来访问类的超类并使用Class#getDeclaredFields()获取其字段,重复(递归)直到您到达Object或您选择的类别想停下来。

以下是一些示例代码:

@Test
public void getDeclFieldsIncludingBase() {
    List<Field> fields = new ArrayList<>();
    getDeclFieldsIncludingBase(B.class, fields);
    for(Field f : fields) {
        System.out.println(f.getName());    
    }
}

private void getDeclFieldsIncludingBase(Class<?> cl, List<Field> fields) {
    Field[] declaredFields = cl.getDeclaredFields();
    for(Field f : declaredFields) {
        fields.add(f);
    }
    Class<?> superclass = cl.getSuperclass();
    if(! Object.class.equals(superclass)) {
        getDeclFieldsIncludingBase(superclass, fields);
    }
}

示例:

public class A {
    int a;
}

public class B extends A {
    int b;
}

输出应为

b
a