我有课程:
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]
如何从所有类中获取所有字段包括extends?
答案 0 :(得分:10)
尝试以下方法:
Field[] fields = c.getClass().getFields();
如果您想要所有超类字段,请参阅以下内容:
Retrieving the inherited attribute names/values using Java Reflection
答案 1 :(得分:6)
您的C类不会扩展任何类。然后,getDeclaredFields()
仅返回String filedC
,如您所见。您无法执行c.fieldA="TestA"
和c.fieldB="TestB"
,因为您的班级未声明此字段。无论如何,在C扩展B和B扩展A的情况下,方法getFields()仅返回公共字段(包括继承):
返回一个包含Field对象的数组,该对象反映此Class对象所代表的类或接口的所有可访问公共字段。
并且getDeclaredFields()返回类中声明的所有字段(不包括继承):
返回Field对象的数组,这些对象反映由此Class对象表示的类或接口声明的所有字段。这包括公共,受保护,默认(包)访问和私有字段,但不包括继承的字段。
答案 2 :(得分:4)
如果您不想重新发明轮子,可以依赖提供Apache Commons Lang的FieldUtils.getAllFieldsList
版本3.2+:
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));
}
}
答案 3 :(得分:1)
如果ClassC
来自ClassB
(并且可能来自ClassA
等),这将适用于反射。我认为这是一个错字?然后这个:
Field[] fields = c.getClass().getFields();
会按预期工作。
答案 4 :(得分:1)
getDeclaredFields()
不包含来自超类的继承字段。
如果你想要所有clield只使用getFields()
方法
答案 5 :(得分:0)
你应该可以用
来获取它们Field[] fields = c.getClass().getFields();
返回所有可访问的字段。