您的位置:首页 > 编程语言 > Java开发

使用内省完成JavaBean到集合的封装

2015-08-31 14:50 591 查看

使用内省完成JavaBean到集合的封装

使用内省得到JavaBean的属性和操作这些属性的方法,将数据封装到集合中或者把集合中的数据封装到JavaBean。

内省对象介绍

-BeanInfo–提供有关其 bean 的方法、属性、事件等显式信息描述的接口类。

方法:

getMethodDescriptors()–获得JavaBean所有方法的描述对象数组

getPropertyDescriptors() –获得JavaBean的所有属性的描述对象数组

-Introspector–提供获取bean信息方法的工具类。

方法:

getBeanInfo(Class beanClass)–在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件.

-MethodDescriptor–描述JavaBean的方法的对象

-PropertyDescriptor–描述JavaBean的属性的对象

* 方法*

getReadMethod()–得到该属性的获取值的方法,即getXX()方法。

getWriteMethod()–得到属性的设值方法,即setXX()方法。

实例代码

JavaBean数据封装到Map集合中

/**
* JavaBean转为Map集合
*
* @param q
*            JavaBean对象
* @return Map集合
*/
public static <Q> Map<String, Object> beanToMap(Q q) {
BeanInfo beanInfo = null;
Map<String, Object> map = new HashMap<String, Object>();
try {
// 拿到泛型为Q的bean的信息
beanInfo = Introspector.getBeanInfo(q.getClass());

// 拿到该bean的方法和属性的描述类数组
MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors();
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

for (PropertyDescriptor pDescriptor : propertyDescriptors) {
System.out.println("pDescriptor.getName()=" + pDescriptor.getName() + "; getShortDescription=" + pDescriptor.getShortDescription() + "; id="
+ pDescriptor.getValue("id"));
}
for (MethodDescriptor mDescriptor : methodDescriptors) {
System.out.println("mDescriptor.getName()=" + mDescriptor.getName() + "; getShortDescription=" + mDescriptor.getShortDescription() + "; id="
+ mDescriptor.getValue("id"));
}
// 遍历将bean的属性值放入Map中
for (PropertyDescriptor pDescriptor : propertyDescriptors) {
String displayName = pDescriptor.getDisplayName();
// 使用内省拿到该属性的获取值的方法,并调用该方法得到属性值
Object invokeValue = pDescriptor.getReadMethod().invoke(q, new Object[] {});

System.out.println("displayName=" + displayName + "; invokeValue=" + invokeValue);
// 存入map集合
if (!"class".equals(displayName)) {
map.put(displayName, invokeValue);
}
}
} catch (IntrospectionException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(map);
return map;
}


Map集合数据封装到JavaBean中

public static <Q> Q mapToBean(Map<String, Object> map, Q q) {
BeanInfo beanInfo = null;
try {
// 拿到bean的信息
beanInfo = Introspector.getBeanInfo(q.getClass());
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

// 遍历属性并赋值
for (PropertyDescriptor pd : propertyDescriptors) {
if (!"class".equals(pd.getDisplayName())) {
String proName = pd.getDisplayName();
// 使用内省拿到该属性的设值方法,并调用该方法执行赋值
pd.getWriteMethod().invoke(q, map.get(proName));

}
}

} catch (IntrospectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(q);
return q;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: