Java Reflection - 获取对象中嵌套对象,列表和数组的值

时间:2012-11-08 22:42:12

标签: java reflection

我不熟悉反射并尝试创建一个通用函数,该函数将接受对象并解析StringString[]List<String>类型的所有字段。嵌套对象中存在的任何StringString[]List<String>也必须进行解析。有没有可以帮助我做到这一点的实用工具?从父对象(User)获取值很简单 - 使用BeanUtils.describe(user); - 它在父对象中提供String值,但不提供String[]List<String>和嵌套宾语。我相信我可能不是第一个需要此功能的人吗?是否有任何实用程序或代码可以帮助我实现这一目标?

public class User {
    private String somevalue;
    private String[] thisArray;
    private List<String> thisList;
    private UserDefinedObject myObject;
    .
    .
    .

}

1 个答案:

答案 0 :(得分:2)

方法Class.getDeclaredFields将为您提供代表该类每个字段的Field数组。您可以遍历这些并检查Field.getType返回的类型。将List类型的字段过滤到List<String>比较棘手 - 请参阅this post以获取相关帮助。

在对所需字段进行第一次动态查找后,您应该跟踪(记忆)相关的Field对象以获得更好的性能。

这是一个简单的例子:

//for each field declared in User,
for (Field field : User.class.getDeclaredFields()) {
    //get the static type of the field
    Class<?> fieldType = field.getType();
    //if it's String,
    if (fieldType == String.class) {
        // save/use field
    }
    //if it's String[],
    else if (fieldType == String[].class) {
        // save/use field
    }
    //if it's List or a subtype of List,
    else if (List.class.isAssignableFrom(fieldType)) {
        //get the type as generic
        ParameterizedType fieldGenericType =
                (ParameterizedType)field.getGenericType();
        //get it's first type parameter
        Class<?> fieldTypeParameterType =
                (Class<?>)fieldGenericType.getActualTypeArguments()[0];
        //if the type parameter is String,
        if (fieldTypeParameterType == String.class) {
            // save/use field
        }
    }
}

请注意,我使用引用相等(==)代替isAssignableFrom来匹配String.classString[].class,因为Stringfinal。< / p>

编辑:刚刚注意到了关于找到嵌套UserDefinedObject的信息。您可以将递归应用于上述策略以搜索这些策略。