[英]Java Reflection - Getting value of nested object, list and array within object
我是反射的新手,并尝试创建一个通用函数,它将接受对象并解析所有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;
.
.
.
}
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.class
和String[].class
因为String
是final
。
编辑:刚刚注意到你找到嵌套的UserDefinedObject
s。 您可以将递归应用于上述策略以搜索这些策略。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.