最近新工作的公司,查询出来的数据都是一个字符串数组,或者是一个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;
}
}