`
tenght
  • 浏览: 47714 次
社区版块
存档分类
最新评论

[java]HashMap与Bean互转

 
阅读更多
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * HashMap与Bean互转工具类
 * 
 * @author hailan
 * @time 2015-10-12下午05:56:34
 */
public class HashMapBeanTools {
	
	/**
	 * HashMap转换成JavaBean
	 * 
	 * @author hailan
	 * @time 下午05:57:16
	 * @param map
	 * @param cls
	 * @return
	 */
	public static Object hashMapToJavaBean(HashMap<?,?> map, Class<?> cls) {
		Object obj = null;
		try {
			obj = cls.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 取出bean里的所有方法
		Method[] methods = cls.getMethods();
		for (int i = 0; i < methods.length; i++) {
			// 取方法名
			String method = methods[i].getName();
			// 取出方法的类型
			Class<?>[] cc = methods[i].getParameterTypes();
			if (cc.length != 1)
				continue;

			// 如果方法名没有以set开头的则退出本次for
			if (!method.startsWith("set") )
				continue;
			// 类型
			String type = cc[0].getSimpleName();

			try {
				//
				Object value = method.substring(3,4).toLowerCase().concat(method.substring(4));
				// 如果map里有该key
				if (map.containsKey(value)) {
					// 调用其底层方法
					setValue(type, map.get(value), i, methods, obj);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return obj;
	}

	/**
	 * 调用底层方法设置值
	 * 
	 * @author hailan
	 * @time 下午06:01:56
	 * @param type
	 * @param value
	 * @param i
	 * @param method
	 * @param bean
	 * @throws Exception 
	 */
	private static void setValue(String type, Object value, int i, Method[] method,
			Object bean) throws Exception {
		if (value != null && !value.equals("")) {
			try {
				if (type.equals("String")) {
					// 第一个参数:从中调用基础方法的对象 第二个参数:用于方法调用的参数
					method[i].invoke(bean, new Object[] { value });
				} else if (type.equals("int") || type.equals("Integer")) {
					method[i].invoke(bean, new Object[] { new Integer(""
							+ value) });
				} else if (type.equals("BigDecimal")) {
					method[i].invoke(bean, new Object[] { new BigDecimal((String)value) });
				} else if (type.equals("long") || type.equals("Long")) {
					method[i].invoke(bean,
							new Object[] { new Long("" + value) });
				} else if (type.equals("boolean") || type.equals("Boolean")) {
					method[i].invoke(bean, new Object[] { Boolean.valueOf(""
							+ value) });
				} else if (type.equals("Date")) {
					Date date = null;
					if (value.getClass().getName().equals("java.util.Date")) {
						date = (Date) value;
					} else {
						//根据文件内的格式不同修改,时间格式太多在此不做通用格式处理。
						if (value.toString().length() > 10){
							String format = "yyyy-MM-dd HHmmss";
							date = parseDateTime("" + value, format);
						} else if (value.toString().length() == 10){
							String format = "yyyy-MM-dd";
							date = parseDateTime("" + value, format);
						} else  if (value.toString().length() == 8){
							String format = "yyyyMMdd";
							date = parseDateTime("" + value, format);
						} else  if (value.toString().length() == 14){
							String format = "yyyyMMddHHmmss";
							date = parseDateTime("" + value, format);
						}else  if (value.toString().length() == 6){
							String format = "HHmmss";
							date = parseDateTime("" + value, format);
						}
					}
					if (date != null) {
						method[i].invoke(bean, new Object[] { date });
					}
				} else if (type.equals("byte[]")) {
					method[i].invoke(bean,
							new Object[] { new String(value + "").getBytes() });
				}
			} catch (Exception e) {
				e.printStackTrace();
				throw e;
			}
		}
	}

	/**
	 * 日期格式转换
	 * 
	 * @author hailan
	 * @time 下午06:02:59
	 * @param dateValue
	 * @param format
	 * @return
	 */
	private static Date parseDateTime(String dateValue, String format) {
		SimpleDateFormat obj = new SimpleDateFormat(format);
		try {
			return obj.parse(dateValue);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	
	public static Map<String, Object> hashJavaBeanToMap(Object ojt) {
		Class<?> cls = ojt.getClass();
		Field[] field = cls.getDeclaredFields();   
		  
        HashMap<String, Object> mapbean = new HashMap<String, Object>();   
        for(int i=0;i<field.length;i++){   
            Field f = field[i];   
            f.setAccessible(true);   
            try {   
            	mapbean.put(f.getName(), f.get(cls));   
            } catch (IllegalArgumentException e) {   
                e.printStackTrace();   
            } catch (IllegalAccessException e) {   
                e.printStackTrace();   
            }   
        }   
		return mapbean;   
    }   

	
}

分享到:
评论

相关推荐

    Bean与Map转换工具类BeanMapConverter.java

    Bean与MAP间互转换的工具类。 1.将一个 Map 对象转化为一个 JavaBean,可指定BEAN的类型; 2.将一个 JavaBean 对象转化为一个 HashMap;

    Java海量数据分页Bean

    Java海量数据分页Bean, 适用于Oracle(适当修改,适用于任何数据库).功能描述:传入到达页码(具有容错性)、每页记录数、Select查询语句,返回该页所有的记录(整页是List集合,每条记录是一个 HashMap)、总行数、总...

    java7hashmap源码-java-note:笔记

    hashmap源码 java-notes 算法 数据结构 设计模式 基础 集合 ConcurrentHashMap IO 并发 [Java 并发]( 并发.md) AQS 源码 JVM web 基础 [NGINX 简介](./docs/nginx/NGINX 简介.md) 框架 Spring [观察 Spring bean ...

    java 读取csv 并转为Map<String,Object>

    通过引用【opevcsv】依赖,逐行读取数据 并转为Map,Object&gt;格式,后续可以通过BeanUtil.MaptoBean()方法将map转为你需要的bean对象; csv文件必须带表头,bean对象命名符合驼峰格式; 通过此方法可以快速的将文件...

    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面试题精选

    Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来...

    java 面试题 总结

    20、EJB与JAVA BEAN的区别? Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有...

    java 经典面试题

    1、面向对象的特征有哪些方面 2 ...并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别 4 9、Collection 和 Collections的区别 4 10、&和&&的区别。 4 11、HashMap和Hashtable的区别。 4

    java面试宝典

    205、EJB与JAVA BEAN的区别? 51 206、EJB的基本架构 51 207、MVC的各个部分都有那些技术来实现?如何实现? 52 208、J2EE是什么? 52 209、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,...

    关于JAVA面试的100题及其答案

    Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来...

    Java常见面试题208道.docx

    面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...

    超级有影响力霸气的Java面试题大全文档

    23、EJB与JAVA BEAN的区别?  Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应...

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

    8. String str="i"与 String str=new String("i")一样吗? 5 9. 如何将字符串反转? 5 10. String 类的常用方法都有那些? 5 11. 抽象类必须要有抽象方法吗? 6 12. 普通类和抽象类有哪些区别? 6 13. 抽象类能使用 ...

    java面试题

    21. EJB与JAVA BEAN的区别? 13 22. Static Nested Class 和 Inner Class的不同。 13 23. JSP中动态INCLUDE与静态INCLUDE的区别? 14 24. List, Set, Map区别 14 25. 集合类都有哪些?主要方法? 14 26. 简述逻辑...

    Java面试宝典-经典

    给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...

    Java面试宝典2010版

    给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...

    java面试题大全(2012版)

    给一个 Bean 的 message 属性, 字符串类型, 注入值为 "Hello" 的 XML 配置文件该怎么写? 125 19、Jdo是什么? 125 20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. ...

    2023年最新java面试大全

    【01期】Spring,SpringMVC,SpringBoot,SpringCloud有什么区别和联系? 【02期】你能说说Spring框架中Bean的生命周期吗? ...【18期】Java序列化与反序列化三连问:是什么?为什么要?如何做?

    java工厂系列设计模式源码与文档

    private Map, Object&gt; map = new HashMap, Object&gt;(); public ClassXmlPathApplicationContext(String fileName) throws Exception, IOException { SAXBuilder sb = new SAXBuilder(); Document document = sb...

    java基础题 很全面

    1. EJB与JAVA BEAN的区别? 20 2. EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 20 3. EJB的角色和三个对象 21 4. EJB容器提供的服务 21 5. EJB规范规定EJB中...

Global site tag (gtag.js) - Google Analytics