从类中获取所有字段(甚至是私有字段和继承字段)

2022-08-31 13:05:50

我正在制作大学项目。
我需要从类中获取所有字段。甚至是私人和继承的。我试图获取所有声明的字段,然后转换为超类并重复。我的代码片段:

private void listAllFields(Object obj) {
    List<Field> fieldList = new ArrayList<Field>();
    while (obj != null) {
        fieldList.addAll(Arrays.asList(obj.getClass().getDeclaredFields()));
        obj = obj.getClass().getSuperclass().cast(obj);
    }
    // rest of code

但它不起作用。 转换后仍然是同一类(不是超类)。
我将不胜感激如何解决转换问题的任何帮助,或者如何以不同的方式检索这些字段。tmpObj

问题不在于获取字段的访问权限,而在于获取字段的名称!
我以这种方式管理它:

private void listAllFields(Object obj) {
    List<Field> fieldList = new ArrayList<Field>();
    Class tmpClass = obj.getClass();
    while (tmpClass != null) {
        fieldList.addAll(Arrays.asList(tmpClass .getDeclaredFields()));
        tmpClass = tmpClass .getSuperclass();
    }
    // rest of code

答案 1
obj = obj.getClass().getSuperclass().cast(obj);

此行不执行您期望它执行的操作。强制转换实际上并不会更改它,它只是告诉编译器将其视为其他内容。Object

例如,您可以将 a 转换为 ,但它仍然是 .ListCollectionList

但是,通过超类向上循环以访问字段无需强制转换即可正常工作:

Class<?> current = yourClass;
while(current.getSuperclass()!=null){ // we don't want to process Object.class
    // do something with current's fields
    current = current.getSuperclass();
}

顺便说一句,如果您可以访问Spring框架,则可以使用一种方便的方法来循环遍历类和所有超类的字段:
ReflectionUtils.doWithFields(baseClass,FieldCallback)
(另请参阅我之前的答案:通过Java中的反射访问私有继承字段)


答案 2

getDeclaredFields()为您提供该类上的所有字段,包括字段。private

getFields()为您提供该类上的所有字段及其超类。public

如果你想要/超类的方法,你将不得不重复调用,然后调用超类对象。privateprotectedgetSuperclass()getDeclaredFields()

javadocs中没有明确解释