3

我是反射的新手,并试图创建一个通用函数,该函数将接收对象并解析所有类型StringString[]或的字段List<String>。嵌套对象中存在的任何String, String[]orList<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;
    .
    .
    .

}
4

1 回答 1

3

该方法将为您提供一个代表类的每个字段的 sClass.getDeclaredFields数组。Field您可以遍历这些并检查返回的类型Field.getType。过滤类型List为 to的字段List<String>比较棘手 - 请参阅这篇文章以获得帮助。

在对所需字段进行第一次动态查找后,您应该跟踪(记忆)相关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因为Stringis final

编辑:刚刚注意到你关于查找嵌套UserDefinedObjects 的一点。您可以对上述策略应用递归以搜索这些策略。

于 2012-11-08T22:47:16.113 回答