将Java字符串数组转化成对应的Entity

本文介绍了如何将查询结果中的字符串数组或List<String[]>转换为更便于操作的Entity对象。作者使用Java反射机制动态获取属性并赋值,简化了手动set方法的编写,但仅支持简单String类型属性的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      最近新工作的公司,查询出来的数据都是一个字符串数组,或者是一个List的字符串数组,个人感觉不是调用的时候不是很方便,而且通过数组下标来获取值有点麻烦,容易出错,所以工作之余写了一个类,将字符串数组String[]或者List<String[]>封装成一个Entity的形式给前台,更加符合面向对象点。

       在实现转换的过程中,我用到了java的反射机制,动态的获取Entity的属性和方法,不过确定是,这里只支持简单的Entity赋值而且还是String类型的,就是一堆String类型的属性生成get/set方法,然后通过工具类,自动赋值,少了在程序中的setXX()的麻烦和无聊的工作。

 

下面是我实现代码:

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * 功能描述:将字符串数组转换成对应的Entity
 * 		  注意: 声明的POJO中,属性必须生成getXX()/setXX()方法
 *
 * @author  lizhenbin
 *
 * <p>修改历史:(修改人,修改时间,修改原因/内容)</p>
 */
public class StrArrayToEntity {
	
	// 本方法只支持获取POJO中的setXX()方法
	private static final String SET_METHOD = "set";
	// 每个字符串字符开始第一个字母
	private static final int strBeginIndex = 0;
	
	/**
	 * 单例模式
	 */
	private static StrArrayToEntity instance = null;
	StrArrayToEntity() {}
	public static synchronized StrArrayToEntity getInstance() {
		if(instance == null)
			instance = new StrArrayToEntity();
		return instance;
	}
	
	/**
	 * 
	 * 功能描述:将List字符串数组转换成POJO List
	 *
	 * @author  lizhenbin
	 * <p>创建日期 :Jun 5, 2012 5:36:13 PM</p>
	 *
	 * @param obj POJO 
	 * @param strList 字符串数组List
	 * @return POJO List集合
	 *
	 * <p>修改历史 :(修改人,修改时间,修改原因/内容)</p>
	 */
	public List<Object> strArrayListToEntity(Object obj, List<String[]> strList) {
		// 空值判断
		if(!checkParam(obj) || !checkParam(strList) || strList.size() < 1) {
			return null;
		}
		/**
		 * 遍历数组转换成POJO形式List
		 */
		List<Object> objlist = new ArrayList<Object>();
		for(String[] strArray : strList) {
			Object objTemp = strToEntity(obj, strArray);
			objlist.add(objTemp);
		}
		return objlist;
	}
	
	/**
	 * 
	 * 功能描述:将字符串数组转换成POJO
	 *
	 * @author  lizhenbin
	 * <p>创建日期 :Jun 5, 2012 4:57:02 PM</p>
	 *
	 * @param obj 目标POJO
	 * @param queryStr 字符串数组
	 * @return POJO的Object对象
	 * @throws Exception
	 *
	 * <p>修改历史 :(修改人,修改时间,修改原因/内容)</p>
	 */
	public Object strToEntity(Object obj, String[] queryStr) {
		// 空值判断
		if(!checkParam(obj) || !checkParam(queryStr)) {
			return null;
		}
		
		// 获取Entity的所有属性名称
		Class clazz = obj.getClass();
		Field[] fields = clazz.getDeclaredFields();
		Method[] methods = clazz.getDeclaredMethods();
		try {
			/**
			 * 当POJO的属性个数大于数组的长度时,默认娶不到值的都是null
			 */
			int index = 0;
			if(fields.length > queryStr.length) {
				for(Field f : fields) {
					StringBuffer sub = new StringBuffer();
					sub.append(SET_METHOD);
					String methodName = f.getName();
					// 截取第一个字母作为大写
					String firstChar = methodName.charAt(strBeginIndex) + "";
					sub.append(firstChar.toUpperCase());
					if(methodName.length() >= 2) {
						sub.append(methodName.substring(1, methodName.length()));
					}
					Method method = null;
					if(!checkMethodExist(methods, sub.toString())) {
						return null;
					}
					//method = clazz.getMethod(sub.toString(), String.class);
					method = clazz.getMethod(sub.toString(), f.getType());
					if(index >= queryStr.length) 
						break;
					method.invoke(obj, queryStr[index]);
					index++;
				}
				/**
				 * 其他情况,当POJO属性个数 <= 数组的长度时候 按顺序取值
				 */
			} else {
				for(Field f : fields) {
					StringBuffer sub = new StringBuffer();
					sub.append(SET_METHOD);
					String methodName = f.getName();
					String firstChar = methodName.charAt(0) + "";
					sub.append(firstChar.toUpperCase());
					if(methodName.length() >= 2) {
						sub.append(methodName.substring(1, methodName.length()));
					}
					Method method = null;
					if(!checkMethodExist(methods, sub.toString())) {
						return null;
					}
					//method = clazz.getMethod(sub.toString(), String.class);
					method = clazz.getMethod(sub.toString(), f.getType());
					method.invoke(obj, queryStr[index]);
					index++;
				}
			}
			return obj;
		} catch (Exception e) {
			System.out.println(StrArrayToEntity.class.getName() + 
					" Error Usage: String Array Change to Entity Error, " +
					"Check POJO get/set Method is Right or String Array is Null!");
		}
		return null;
	}
	
	/**
	 * 
	 * 功能描述:验证方法是否存在POJO中
	 *
	 * @author  lizhenbin
	 * <p>创建日期 :Jun 5, 2012 5:30:05 PM</p>
	 *
	 * @param methods
	 * @param methodName
	 * @return
	 *
	 * <p>修改历史 :(修改人,修改时间,修改原因/内容)</p>
	 */
	private boolean checkMethodExist(Method[] methods, String methodName) {
		for(Method m : methods) {
			if(m.getName().equals(methodName))
				return true;
		}
		return false;
	}
	
	/**
	 * 
	 * 功能描述:简单验证空值
	 *
	 * @author  lizhenbin
	 * <p>创建日期 :Jun 5, 2012 5:44:23 PM</p>
	 *
	 * @param obj
	 * @return
	 *
	 * <p>修改历史 :(修改人,修改时间,修改原因/内容)</p>
	 */
	public boolean checkParam(Object obj) {
		if(obj == null) {
			System.out.println(StrArrayToEntity.class.getName() + 
					" Null Point Error: Input Param Data is Null.");
			return false;
		}
		return true;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值