3

我有课:

ClassA{
 public String filedA;
}

ClassB extends ClassA{
 public String filedB;
}

ClassC extends ClassB{
 public String filedC;
}

然后我创建对象:

ClassC c=new ClassC();
c.fieldC="TestC";
c.fieldA="TestA";
c.fieldB="TestB";

在我尝试获取所有字段后,我打电话给

Field[] fields=c.getClass().getDeclaredFields();

但我得到的数组只有一项

fields[fieldC]

如何从所有类中获取所有字段包括扩展?

4

6 回答 6

10

尝试以下操作:

Field[] fields = c.getClass().getFields();

如果您想要所有超类字段,请参阅以下内容:

使用 Java 反射检索继承的属性名称/值

于 2012-12-03T14:30:18.957 回答
7

您的 C 类不扩展任何类。然后,getDeclaredFields()只返回String filedC如您所见。你不能这样做c.fieldA="TestA"c.fieldB="TestB"因为你的类没有声明这个字段。无论如何,在 C 扩展 B 和 B 扩展 A 的情况下,getFields()方法仅返回公共字段(包括继承的):

返回一个包含 Field 对象的数组,反映了由此 Class 对象表示的类或接口的所有可访问公共字段。

并且getDeclaredFields()返回类中声明的所有字段(不包括继承的):

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

于 2012-12-03T14:36:08.423 回答
6

如果您不想重新发明轮子,您可以依赖Apache Commons Lang版本 3.2+,它提供FieldUtils.getAllFieldsList

import java.lang.reflect.Field;
import java.util.AbstractCollection;
import java.util.AbstractList;
import java.util.AbstractSequentialList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.lang3.reflect.FieldUtils;
import org.junit.Assert;
import org.junit.Test;

public class FieldUtilsTest {

    @Test
    public void testGetAllFieldsList() {

        // Get all fields in this class and all of its parents
        final List<Field> allFields = FieldUtils.getAllFieldsList(LinkedList.class);

        // Get the fields form each individual class in the type's hierarchy
        final List<Field> allFieldsClass = Arrays.asList(LinkedList.class.getFields());
        final List<Field> allFieldsParent = Arrays.asList(AbstractSequentialList.class.getFields());
        final List<Field> allFieldsParentsParent = Arrays.asList(AbstractList.class.getFields());
        final List<Field> allFieldsParentsParentsParent = Arrays.asList(AbstractCollection.class.getFields());

        // Test that `getAllFieldsList` did truly get all of the fields of the the class and all its parents 
        Assert.assertTrue(allFields.containsAll(allFieldsClass));
        Assert.assertTrue(allFields.containsAll(allFieldsParent));
        Assert.assertTrue(allFields.containsAll(allFieldsParentsParent));
        Assert.assertTrue(allFields.containsAll(allFieldsParentsParentsParent));
    }
}
于 2016-04-12T08:54:49.800 回答
1

ClassC如果源自ClassB(并且可能源自ClassA等),这将与反射一起使用。我认为这是一个错字?然后这个:

Field[] fields = c.getClass().getFields();

会按预期工作。

于 2012-12-03T14:32:36.947 回答
1

getDeclaredFields()您正在使用的,不包含从超类继承的字段。

如果你想要所有的clields只需使用getFields()方法

于 2012-12-03T14:48:08.143 回答
0

你应该能够得到它们

Field[] fields = c.getClass().getFields();

这将返回所有可访问的字段。

于 2012-12-03T14:31:23.357 回答