当前位置: 首页 > 知识库问答 >
问题:

从类中获取所有字段(即使是私有和继承的)

沈曜灿
2023-03-14

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

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

共有3个答案

魏勇军
2023-03-14

这是我用来获取对象所有字段的方法

private <T> List<Field> getFields(T t) {
        List<Field> fields = new ArrayList<>();
        Class clazz = t.getClass();
        while (clazz != Object.class) {
            fields.addAll(Arrays.asList(clazz.getDeclaredFields()));
            clazz = clazz.getSuperclass();
        }
        return fields;
    }
应煌
2023-03-14

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

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

如果你想要超类的私有方法,你必须反复调用getSuperclass(),然后在超类对象上调用getDeclaredFields()。

这里没有什么在javadocs里解释不清楚的

闻人浩波
2023-03-14
obj = obj.getClass().getSuperclass().cast(obj);

这一行并没有达到你期望的效果。强制转换对象实际上并不会改变它,它只是告诉编译器将其视为其他对象。

E、 g.您可以将列表转换为集合,但它仍然是列表。

但是,通过超类循环访问字段可以在不强制转换的情况下正常工作:

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(基类,FieldCallback)
(另请参阅我之前的回答:通过Java中的反射访问私有继承字段)

 类似资料:
  • 问题内容: 我正在做大学项目。 我需要从课堂上获取所有字段。甚至是私有的并继承的。我试图获取所有声明的字段,然后转换为超类并重复。我的代码片段: 但这行不通。强制转换后仍然是同一类(不是超类)。 我将感谢您提供任何有关如何解决铸造问题或如何以其他方式检索这些字段的帮助。 问题不是要访问字段,而是要获取字段名称! 我以这种方式进行管理: 问题答案: obj = obj.getClass().getS

  • 问题内容: 我读过一个子类不能继承私有字段或方法。但是,在这个例子中 运行时,输出为。似乎是从继承了private属性。 所以,请解释这里发生了什么。谢谢。 问题答案: 子类具有其超类的字段,但不能直接访问它们。同样,子类“具有”私有方法,但是您不能直接从子类中调用或重写它们。 在有关继承的Java文档中,它说 子类并 没有 继承父类的私有成员。 但是,我认为将其视为 子类继承其父类的私有成员,但

  • 问题内容: 这是一个面试问题。 子类是否继承私有字段? 我回答“否”,因为我们无法使用“常规OOP方式”访问它们。但是访问者认为它们是继承的,因为我们可以间接或使用反射来访问这些字段,并且它们仍然存在于对象中。 回来后,我在javadoc中找到了以下引号: 超类私人成员 子类不继承其父类的私有成员。 你知道面试官的观点有什么论据吗? 问题答案: 这里的问题/答案中的大多数困惑都围绕着继承的定义。

  • 问题内容: 我想知道是否有一种方法可以获取java中某个类的所有私有字段及其类型。 例如,假设我有一堂课 现在,我想获得的所有私有字段(,,类)(如果不知道所有领域前期的名称),并检查它们的类型。 问题答案: 有可能获得与方法的所有字段的。然后,您必须检查每个字段的修饰符以查找私有字段: 请注意,这不会返回继承的字段。 最终,您可以使用Field.getType()方法获得字段的类型。

  • 现在,我想获取类的所有私有字段(、、)(事先不知道所有字段的名称)并检查它们的类型。

  • FAQs in section [24]: [24.1] 如何表示“私有继承”? [24.2] 私有继承和组合(composition)有什么类似? [24.3] 我应该选谁:组合还是私有继承? [24.4] 从私有继承类到父类需要指针类型转换吗? [24.5] 保护继承和私有继承的关系是什么? [24.6] 私有继承和保护继承的访问规则是什么? 24.1 如何表示“私有继承”? 用 : priv