繁体   English   中英

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

[英]Java Reflection - Getting value of nested object, list and array within object

我是反射的新手,并尝试创建一个通用函数,它将接受对象并解析所有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;
    .
    .
    .

}

Class.getDeclaredFields方法将为您提供表示类的每个字段的Field数组。 您可以循环遍历这些并检查Field.getType的类型。 过滤List to List<String>类型的字段比较棘手 - 请参阅此帖子以获取帮助。

在对您想要的字段进行第一次动态查找之后,您应该跟踪(memoize)相关的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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM