`

通过反射实现map和bean之间的转换

    博客分类:
  • Java
 
阅读更多

直接看代码:

 

public class ConvertUtil {

	private static final Logger logger = Logger.getLogger(ConvertUtil.class);

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		OrgResponse resp = new OrgResponse();
		resp.setAccountNumber("12346");
		resp.setCustomerID("5566");
		resp.setPassword("hello1sa");

//		Map<String, Object> resultMap = ConvertUtil.convertBeanToMap(resp);
//		System.out.println("convertSimpleBeanToMap result: ");
//		for (Entry<String, Object> en : resultMap.entrySet()) {
//			logger.info(en.getKey() + ": " + en.getValue());
//		}
//
//		OrgResponse newRes = convertMapToBean(resultMap, resp);
//		System.out.println("convertMapToSimpleBean result: ");
//		logger.info(newRes.getAccountNumber()+", " + newRes.getCustomerID() + ", "
//				+ newRes.getPassword());


	}

	/**
	 * Use Reflection to convert Map to java Bean, Ignore the upper/lower case of attributes letters.
	 *
	 */
	public static <T> T convertMapToBean(Map<String, Object> map, T t) {
		Set<Entry<String, Object>> entrySet = map.entrySet();
		for (Entry<String, Object> et : entrySet) {
			String key = et.getKey().toLowerCase(); // convert to lower case
			Object value = et.getValue();

			List<Method> list = new ArrayList<Method>();
			getObjSetMethodsWithExtends(t.getClass(), list);
			for (int i = 0; i < list.size(); i++) {
				String name = list.get(i).getName();// method name
				if (!changeStrToSetMethodNames(key).equalsIgnoreCase(name))
					continue;
				try {
					list.get(i).invoke(t, value);
				} catch (Exception e) {
					logger.error(e.getMessage(), e);
				}
				break;
			}
		}
		return t;
	}

	/**
	 * Use Reflection to convert java Bean to Map
	 *
	 */
	public static <T> Map<String, Object> convertBeanToMap(T t) {
		Map<String, Object> map = new HashMap<String, Object>();

		Class cls = t.getClass();
		Field[] fieldlist = cls.getDeclaredFields();
		for (int i = 0; i < fieldlist.length; i++) {
			Field f = fieldlist[i];
			String name = f.getName();
			Class<?> cs = f.getType();
			try {
				String methodNme = changeStrToGetMethodNames(name);
				Method meth = null;
				Method[] mds = cls.getDeclaredMethods();
				for (int j = 0; j < mds.length; j++) {
					if (mds[j].getName().equals(methodNme)) {
						meth = cls.getMethod(methodNme);
						Object rtcs = meth.invoke(t, null);
						map.put(name, rtcs);
						break;
					}
				}
				if (meth == null) {
					logger.info("Can not find the method " + methodNme + " in class " + t.getClass().getName());
				}

			} catch (SecurityException e) {
				logger.error(e.getMessage(), e);
			} catch (NoSuchMethodException e) {
				logger.error(e.getMessage(), e);
			} catch (IllegalArgumentException e) {
				logger.error(e.getMessage(), e);
			} catch (IllegalAccessException e) {
				logger.error(e.getMessage(), e);
			} catch (InvocationTargetException e) {
				logger.error(e.getMessage(), e);
			}
		}
		return map;
	}

	private static String changeStrToSetMethodNames(String str) {
		if (str == null || "".equals(str.trim()))
			return null;
		char firstChar = str.toCharArray()[0];
		String upstr = String.valueOf(firstChar).toUpperCase();
		return "set" + upstr + str.substring(1);
	}

	private static String changeStrToGetMethodNames(String str) {
		if (str == null || "".equals(str.trim()))
			return null;
		char firstChar = str.toCharArray()[0];
		String upstr = String.valueOf(firstChar).toUpperCase();
		return "get" + upstr + str.substring(1);
	}

	private static void getObjSetMethodsWithExtends(Class<?> cls, List<Method> list) {
		if (cls.equals(Object.class)) {
			return;
		}

		Method[] mds = cls.getDeclaredMethods();
		for (int i = 0; i < mds.length; i++) {
			if (!mds[i].getName().startsWith("set"))
				continue;
			list.add(mds[i]);
		}
		getObjSetMethodsWithExtends(cls.getSuperclass(), list);
	}

}

  

分享到:
评论

相关推荐

    map 和 bean 之间的转换

    map 和 bean 之间的转换,可以利用反射的原理实现

    java Map转换成bean,利用java反射以及java和bean包

    java Map转换成bean,利用java反射以及java和bean包将map,Object&gt;类型集合转换成需要的javaBean

    map与Javabean相互转换实例

    基本介绍使用反射将普通Javabean与map集合的相互转换实例,项目开发时编写自己的转换帮助类,更好满足开发时所需

    mapstruct:用于生成类型安全的bean映射器的注释处理器

    该生成器具有合理的默认值和许多内置的类型转换,但是在配置或实现特殊行为时,它会自动退出。 与在运行时工作的映射框架相比,MapStruct具有以下优点: 通过使用普通方法调用而不是反射来快速执行编译时类型安全。...

    基于Java反射的map自动装配JavaBean工具类设计示例代码

    主要给大家介绍了关于基于Java反射的map自动装配JavaBean工具类设计的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起看看吧

    根据表结构自动生成JavaBean,史上最强最专业的表结构转JavaBean的工具(第12版)

    于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持...

    免费开源!!生成类型安全 bean 映射器的注释处理器

    生成器带有合理的默认值和许多内置类型转换,但在配置或实现特殊行为时它会妨碍您。 与运行时工作的映射框架相比,MapStruct 具有以下优点: 通过使用普通方法调用而不是反射来快速执行 编译时类型安全。只能映射...

    BeanMapper:比BeanUtils.copyProperties更快

    BeanMapper通过javassist类库实现在运行时直接生成字节码来转换类,在首次生成后,后续运行可以提供近原生的读写速度。 限制条件 类必须具有符合小驼峰规范的JavaBean setter和getter。否则无法正常访问类。 类必须...

    史上最全java面试,103项重点知识,带目录

    26. 如何实现数组和 List 之间的转换? 11 27. ArrayList 和 Vector 的区别是什么? 11 28. Array 和 ArrayList 有何区别? 12 29. 在 Queue 中 poll()和 remove()有什么区别? 12 30. 哪些集合类是线程安全的? 12 ...

    DWR.xml配置文件说明书(含源码)

    仅仅通过反射方法没有办法知道集合元素中的类型,所以上面的两个converter能将任何集合转换成相对javascript而言有意义的对象.然而没有办法将不同的集合类类型分别采用不同的转换方法.因为没有办法完全自动进行转换,...

    JAVA面试题最全集

    10.session bean 和 entity bean的区别 11.ejb中的transaction机制 12.synchronized (生产者和消费) 13.String 和 StringBuffer 14.Serializable 15.MVC (Struts的工作流程) 16.什么是MDA 17.tcp与udp的...

    java面试题

    并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 9 6. Collection 和 Collections的区别。 9 7. &和&&的区别。 9 8. HashMap和Hashtable的区别。 10 9. final, finally, finalize的区别...

    Java常见面试题208道.docx

    26.如何实现数组和 List 之间的转换? 27.ArrayList 和 Vector 的区别是什么? 28.Array 和 ArrayList 有何区别? 29.在 Queue 中 poll()和 remove()有什么区别? 30.哪些集合类是线程安全的? 31.迭代器 Iterator ...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    FactoryInstance 的 lookup() 方法被调用,在 SpringFactoryInstance 中,首先查找 Spring 容器,然后,通过 Bean 的 ID 查找 Bean,最终,FlexService 接口的实例被返回。 注意到 destination 的 id 并没有写死在...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    FactoryInstance 的 lookup() 方法被调用,在 SpringFactoryInstance 中,首先查找 Spring 容器,然后,通过 Bean 的 ID 查找 Bean,最终,FlexService 接口的实例被返回。 注意到 destination 的 id 并没有写死在...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

    第23章 管理Session和实现对话  23.1 管理Session对象的生命周期  23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第23章 管理Session和实现对话  23.1 管理Session对象的生命周期  23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

    第23章 管理Session和实现对话  23.1 管理Session对象的生命周期  23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

    第23章 管理Session和实现对话  23.1 管理Session对象的生命周期  23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 ...

Global site tag (gtag.js) - Google Analytics