利用Java的反射机制实现Bean实体与Map自动转换的工具类

原创 2016年01月09日 15:22:15


在实际项目中,我们通常会以Map的形式装载一些参数进行传参,而在一些特定的场合我们总是希望这些松散的属性能以java Bean的实体形式进行传递,于是,我们需要写很多相同的但又简单的不能再简单的语句重复一万遍.....例如:  

<span style="white-space:pre">		</span>Map<String ,Object> map = new HashMap<String ,Object>();
		map.put("status", ex1.getStatus());
		map.put("gender",  ex1.getGender());
		map.put("age",  ex1.getAge());
		map.put("temp",  ex1.getTemp());
		map.put("name",  ex1.getName()); 

这仅仅是5个属性,在实际情况中,随便的实体恐怕都有十几个属性,这样会有大量的冗余代码,鉴于Map这种松散的传参和Bean紧凑传参的方式不可避免而又各有优劣,我们有理由找到一个高效的方式使这两种结构无缝互转,我们知道Bean和Map的数据(逻辑)结构都相对简单,我们需要的仅仅是能获取到Bean的内部字段的名称和值,对应到Map的key-value即可,因此,Java的反射机制成了不二之选。废话少说,talk is cheap !show me the code!

package prs.rfh.test.flex;

import java.lang.reflect.Field;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


/**
 * @category Util
 * @author renfh
 * @since 2016-1-9
 * @version 1.0
 */
public class TransBeanMapUtil {
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>private static Log log = LogFactory.getLog(TransBeanMapUtil.class);
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>/**
<span style="white-space:pre">	</span> * trans elem from map to a bean
<span style="white-space:pre">	</span> * @param map 
<span style="white-space:pre">	</span> * @param t Bean
<span style="white-space:pre">	</span> */
<span style="white-space:pre">	</span>public static <T extends Object,O> void  transMapToBean(T t,Map<String ,Object> map){
<span style="white-space:pre">		</span>
<span style="white-space:pre">		</span>if(t!=null&&map!=null){
<span style="white-space:pre">			</span>Class clazz = t.getClass();


<span style="white-space:pre">			</span>for(;clazz!=Object.class;clazz = clazz.getSuperclass()){
<span style="white-space:pre">				</span>Field [] fields = clazz.getDeclaredFields();
<span style="white-space:pre">				</span>for(int i=0 ;i<fields.length;i++){
<span style="white-space:pre">					</span>String name = fields[i].getName();
<span style="white-space:pre">					</span>Object value = map.get(name);
<span style="white-space:pre">					</span>fields[i].setAccessible(true);
<span style="white-space:pre">					</span>try {
<span style="white-space:pre">						</span>fields[i].set(t,value);
<span style="white-space:pre">					</span>} catch (IllegalArgumentException e) {
<span style="white-space:pre">						</span>e.printStackTrace();
<span style="white-space:pre">					</span>} catch (IllegalAccessException e) {
<span style="white-space:pre">						</span>e.printStackTrace();
<span style="white-space:pre">					</span>}
<span style="white-space:pre">				</span>}
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>/**
<span style="white-space:pre">	</span> * trans entity from bean to a map
<span style="white-space:pre">	</span> * @param map 
<span style="white-space:pre">	</span> * @param b Bean
<span style="white-space:pre">	</span> */
<span style="white-space:pre">	</span>public static <B extends Object> Map<String,Object> transBeanToMap( B b ){
<span style="white-space:pre">		</span>Class clazz = b.getClass();
<span style="white-space:pre">		</span>Map<String ,Object> map = new HashMap<String , Object>();
<span style="white-space:pre">		</span>if(b!=null){
<span style="white-space:pre">			</span>do {
<span style="white-space:pre">				</span>Field [] fields = clazz.getDeclaredFields();
<span style="white-space:pre">				</span>for(int i = 0 ;i < fields.length; i++){
<span style="white-space:pre">					</span>fields[i].setAccessible(true);
<span style="white-space:pre">					</span>try {
<span style="white-space:pre">						</span>map.put(fields[i].getName(),fields[i].get(b));
<span style="white-space:pre">					</span>} catch (IllegalArgumentException e) {
<span style="white-space:pre">						</span>e.printStackTrace();
<span style="white-space:pre">					</span>} catch (IllegalAccessException e) {
<span style="white-space:pre">						</span>e.printStackTrace();
<span style="white-space:pre">					</span>}
<span style="white-space:pre">				</span>}
<span style="white-space:pre">				</span>clazz = clazz.getSuperclass();
<span style="white-space:pre">			</span>}while(clazz!=Object.class);
<span style="white-space:pre">		</span>}else if(log.isDebugEnabled()){
<span style="white-space:pre">				</span>log.debug("["+new Date()+"]"+TransBeanMapUtil.class+" occured a error while the bean is null");
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>return map;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>public static void main(String[] args) {
<span style="white-space:pre">		</span>Map<String ,Object> map = new HashMap<String ,Object>();
<span style="white-space:pre">		</span>map.put("status", 1);
<span style="white-space:pre">		</span>map.put("gender", "nan");
<span style="white-space:pre">		</span>map.put("age", "12");
<span style="white-space:pre">		</span>map.put("temp", "bad");
<span style="white-space:pre">		</span>map.put("name", "tom");
<span style="white-space:pre">		</span>Father tom  = new Son();
<span style="white-space:pre">		</span>TransBeanMapUtil.transMapToBean(tom, map);
<span style="white-space:pre">		</span>System.out.println(map);
<span style="white-space:pre">		</span>Map<String ,Object> map_kate = TransBeanMapUtil.transBeanToMap(tom);
<span style="white-space:pre">		</span>System.out.println(map_kate);
<span style="white-space:pre">	</span>}
}

附具有继承关系的Bean实体类两个:

父类

package prs.rfh.test.flex;

public class Father {
	private String name;
	private String age;
	private String gender;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	
}

子类

package prs.rfh.test.flex;

public class Son extends Father {
	private String status ;
	private String temp;
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	public String getTemp() {
		return temp;
	}
	public void setTemp(String temp) {
		this.temp = temp;
	}
}

以上完成了一个简单的Map与Bean互转的Util工具类,可以实现对任何可见性的Bean及其父类的属性的值到Map的相互转换。由于只是实现了一个简单的功能,可能不够完善,不足之处还望指正,不胜感谢!





JAVA中,Map转实体类、实体类转Map的方法

问世间情是何物 2017-05-30 15:03 话不多说,直接上干货 Map转换实体类的方法如下: 实体类转换Map的方法如下: 如果大家有什么不理解的地方,可以在评论里...

实体类与Map互转工具类

import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspe...

Java 中 Map与JavaBean实体类之间的相互转化

在做导入的时候,遇到了需要将map对象转化 成javabean的问题,也就是说,不清楚javabean的内部字段排列,只知道map的 key代表javabean的字段名,value代表值。 那现...

java反射实现实体类与实体DTO类之间的转换

在项目中的架构中,经常用到实体类与实体DTO之间的数据互相赋值,结合java的反射技术,写了一个工具类,与大家分享下。 import java.lang.reflect.Field;import ja...

Java对象与Map的转换

 首先是将map和要被赋值的Bean传进来 public static void setValue(Map map,Object thisObj) { Set set = map.k...
  • bober
  • bober
  • 2010年08月12日 17:04
  • 47351

java实体类转成Map

将实体类转成Map private static Logger LOGGER = LoggerFactory.getLogger(BeanUtils.class); // Bean -...

java中使用反射获取pojo(实体)类的所有字段值

说起反射,不得不说它实在是太强大了,通过反射就可以轻轻松松拿到各种东东,如果你想在项目中解除对某个类的依赖,可以考虑用反射。        今天跟大家分享的是通过java中的反射,获取pojo类的...

从数据库读取数据后利用反射为对应的实体类的属性赋值

1、连接数据库并关闭连接(jdbctools.java) package com.xiaojie.dao; import java.io.IOException; import java.sql.C...

简单的java 反射机制实践 map 与object对象的转换

这是我对java反射机制的一点认识,利用反射可以将map集合与object对象进行转化,我想如果可以的话可以进一步改善当做一个框架来编写...

map和bean互转工具

这个在项目里有时候很有用,map2bean和bean2map, 也有时候会用到json,也可以用gson的工具. package com.newnewbank.utils.bean; import...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用Java的反射机制实现Bean实体与Map自动转换的工具类
举报原因:
原因补充:

(最多只允许输入30个字)