我不熟悉反射并尝试创建一个通用函数,该函数将接受对象并解析String
,String[]
或List<String>
类型的所有字段。嵌套对象中存在的任何String
,String[]
或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;
.
.
.
}
答案 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.class
和String[].class
,因为String
是final
。< / p>
编辑:刚刚注意到了关于找到嵌套UserDefinedObject
的信息。您可以将递归应用于上述策略以搜索这些策略。