获取类层次结构的各个领域[复制](Get all Fields of class hierarchy

2019-08-03 11:39发布

这个问题已经在这里有一个答案:

  • 检索使用Java反射机制继承的属性名称/值 12个回答

我有课:

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]

如何获得来自包括扩展的所有类的所有字段?

Answer 1:

尝试以下方法:

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

如果你希望所有超场,看到以下内容:

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



Answer 2:

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

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

和getDeclaredFields()返回在类中声明(不含继承)的所有字段:

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



Answer 3:

如果你不想重塑你可以依靠轮阿帕奇共享郎版本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));
    }
}


Answer 4:

这将与反思工作,如果ClassC源自ClassB (大概是从ClassA等)。 我想这是一个错字? 那么这样的:

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

如预期会工作。



Answer 5:

getDeclaredFields()你正在使用,不包含来自超类继承flields。

如果你希望所有clields只需使用getFields()方法



Answer 6:

你应该能够让他们

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

这将返回所有可访问的领域。



文章来源: Get all Fields of class hierarchy [duplicate]