Java反射-获取对象中嵌套对象、列表和数组的值
我不熟悉反射,并尝试创建一个通用函数,该函数将接收对象并解析所有类型为Java反射-获取对象中嵌套对象、列表和数组的值,java,reflection,Java,Reflection,我不熟悉反射,并尝试创建一个通用函数,该函数将接收对象并解析所有类型为String、String[]或List的字段。嵌套对象中存在的任何字符串、字符串[]或列表,也必须进行解析。有什么实用工具可以帮助我做到这一点吗?从父对象(User)获取值很简单-使用BeanUtils.descripe(User)-它给出父对象中的字符串值,但不给出字符串[]、列表和嵌套对象。我相信我可能不是第一个需要此功能的人?是否有任何实用程序或代码可以帮助我实现这一点 public class User {
String
、String[]
或List
的字段。嵌套对象中存在的任何字符串
、字符串[]
或列表
,也必须进行解析。有什么实用工具可以帮助我做到这一点吗?从父对象(User
)获取值很简单-使用BeanUtils.descripe(User)代码>-它给出父对象中的字符串
值,但不给出字符串[]
、列表
和嵌套对象。我相信我可能不是第一个需要此功能的人?是否有任何实用程序或代码可以帮助我实现这一点
public class User {
private String somevalue;
private String[] thisArray;
private List<String> thisList;
private UserDefinedObject myObject;
.
.
.
}
公共类用户{
私有字符串值;
私有字符串[]这个数组;
私人名单;
私有用户定义对象myObject;
.
.
.
}
该方法将获得一个表示类中每个字段的字段数组。您可以循环这些并检查返回的类型。过滤List
到List
类型的字段比较棘手-请参阅以获取相关帮助
对所需字段执行第一次动态查找后,应跟踪(记忆)相关的字段
对象,以获得更好的性能
下面是一个简单的例子:
//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
}
}
}
//对于用户中声明的每个字段,
for(字段:User.class.getDeclaredFields()){
//获取字段的静态类型
类fieldType=field.getType();
//如果是字符串,
if(fieldType==String.class){
//保存/使用字段
}
//如果是字符串[],
else if(fieldType==String[].class){
//保存/使用字段
}
//如果是列表或列表的子类型,
else if(List.class.isAssignableFrom(fieldType)){
//将类型获取为泛型
参数化类型fieldGenericType=
(ParameterizedType)字段。getGenericType();
//获取它的第一个类型参数
类fieldTypeParameterType=
(类)fieldGenericType.getActualTypeArguments()[0];
//如果类型参数为字符串,
if(fieldTypeParameterType==String.class){
//保存/使用字段
}
}
}
请注意,我使用了引用等式(=
)而不是isAssignableFrom
来匹配String.class
和String[].class
,因为String
是final
Edit:刚刚注意到您关于查找嵌套的UserDefinedObject
s的内容。您可以对上述策略应用递归来搜索这些功能。“我相信我可能不是第一个需要此功能的人?”。。。我肯定我不是第一个问你是否真的需要这个功能的人因为人们经常使用反射来做应该非反射地做的事情。