蓝奥

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

使用内省完成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;

	}
posted on 2015-08-31 15:03  蓝奥  阅读(263)  评论(0编辑  收藏  举报