使用Java反射获取嵌套字段(对象类型字段的字段)的值

3

有一个类,其中一些字段是用户定义的对象。我将:

  1. 获取主类的字段并遍历它们以获取其值。

    1.1 当遇到类型为对象的字段时,通过该对象遍历其自己的字段

  2. 获取这些嵌套字段(对象类型字段的字段)的值

问题出现在第2步; 当我获得对象字段的字段时,无法获取它们的值,因为我需要传递一个对象到 field.get(object) 来指示我想要从中提取字段值的对象,但是如何访问具有对象类型字段的当前对象?

以下是代码:

public class PrimaryClass {
    String str;
    int num;
    MyClass cls;
}


PrimaryClass primaryObject = new PrimaryClass();

Field[] primaryObjectFields = primaryObject.getClass().getDeclaredFields();

// ... One of the fields is :  MyClass foo.bar.cls
// Assuming stored with name of clsField 

Field[] myClassObjectFields = clsField.getType().getDeclaredFields();

for (Field f : myClassObjectFields) {

    String fieldValue = f.get(primaryObject /* What to pass here? */); 
    // !!!! The above line Doesn't work since the primary Object doesn't have access to its child's fields

    System.out.println(fieldValue);

}

当我获取第一级字段(并将其设为可访问状态 setAccessible(true)),为了获得其内部对象字段,我调用以下方法:
topLevelField.getClass().getDeclaredField("details"); 
topLevelField.setAccessible(true);
topLevelField.get(primaryObject);

但是我无法访问父对象内实例化的对象字段,并出现以下错误:
java.lang.IllegalArgumentException: Can not set java.util.List field com.foo.Bar.details to com.foo.Bar

内部对象是一个对象的列表,但在某些情况下也可以是非列表对象。
1个回答

1

这是一个很酷的教程,可以帮助你入门。一般来说,get返回一个对象,然后你可以将其转换为任何类型。此外,你还可以查询字段的类型,根据字段的类型进行一些逻辑操作。还有一些很酷的方法,最好熟悉一下clazz.isAssignableFrom(obj.getClass())

你可以在这里阅读更多相关内容。


1
谢谢您的回答,但我不知道如何将其映射为解决方案。当我获取第一级字段(并使用setAccessible(true)设置其可访问性)时,要获取其内部对象字段,请使用以下代码:topLevelField.getClass().getDeclaredField("details"); topLevelField.setAccessible(true); topLevelField.get(primarySetObject); 但是无法访问在父对象中实例化的对象字段,并出现此错误:java.lang.IllegalArgumentException: Can not set java.util.List field com.foo.Bar.details to com.foo.Bar。内部对象是一个对象列表。 - DummyBeginner
@DummyBeginner 首先,使用“topLevelField.setAccessible(true);”是一个不好的习惯,可能会导致生产问题。 其次,如果您有适当的变量名称和getter和setter,可以使用Apache Commons的Field Utils。对于列表来说,稍微复杂一些,但我的意思是,通过类型处理字段的if else语句。 - NiNiCkNaMe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接