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