拿ItTye上的machael的Code改的一个反射工具,改动主要在于:
能支持 _fieldName 字段 与 getFieldName() 形式命名方法的对应。
1 import java.lang.reflect.Field; 2 import java.lang.reflect.Method; 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 import java.util.HashMap; 6 import java.util.Locale; 7 import java.util.Map; 8 9 /** 10 * java bean 反射工具 11 */ 12 public class BeanRefUtil { 13 14 /** 15 * 取Bean的属性和值对应关系的MAP 16 * @param bean 17 * @return Map 18 */ 19 public static Map<String, String> getFieldValueMap(Object bean) { 20 Class<?> cls = bean.getClass(); 21 Map<String, String> valueMap = new HashMap<String, String>(); 22 // 取出bean里的所有方法 23 Method[] methods = cls.getDeclaredMethods(); 24 Field[] fields = cls.getDeclaredFields(); 25 26 for (Field field : fields) { 27 try { 28 String fieldType = field.getType().getSimpleName(); 29 String fieldGetName = parGetName(field.getName()); 30 if (!checkGetMet(methods, fieldGetName)) { 31 continue; 32 } 33 Method fieldGetMet = cls 34 .getMethod(fieldGetName, new Class[] {}); 35 Object fieldVal = fieldGetMet.invoke(bean, new Object[] {}); 36 String result = null; 37 if ("Date".equals(fieldType)) { 38 result = fmtDate((Date) fieldVal); 39 } else { 40 if (null != fieldVal) { 41 result = String.valueOf(fieldVal); 42 } 43 } 44 String fieldKeyName = parKeyName(field.getName()); 45 valueMap.put(fieldKeyName, result); 46 } catch (Exception e) { 47 continue; 48 } 49 } 50 return valueMap; 51 52 } 53 54 /** 55 * set属性的值到Bean 56 * @param bean 57 * @param valMap 58 */ 59 public static void setFieldValue(Object bean, Map<String, String> valMap) { 60 Class<?> cls = bean.getClass(); 61 // 取出bean里的所有方法 62 Method[] methods = cls.getDeclaredMethods(); 63 Field[] fields = cls.getDeclaredFields(); 64 65 for (Field field : fields) { 66 try { 67 68 String fieldSetName = parSetName(field.getName()); 69 if (!checkSetMet(methods, fieldSetName)) { 70 continue; 71 } 72 Method fieldSetMet = cls.getMethod(fieldSetName, field 73 .getType()); 74 String fieldKeyName = parKeyName(field.getName()); 75 String value = valMap.get(fieldKeyName); 76 if (null != value && !"".equals(value)) { 77 String fieldType = field.getType().getSimpleName(); 78 if ("String".equals(fieldType)) { 79 fieldSetMet.invoke(bean, value); 80 } else if ("Date".equals(fieldType)) { 81 Date temp = parseDate(value); 82 fieldSetMet.invoke(bean, temp); 83 } else if ("Integer".equals(fieldType) 84 || "int".equals(fieldType)) { 85 Integer intval = Integer.parseInt(value); 86 fieldSetMet.invoke(bean, intval); 87 } else if ("Long".equalsIgnoreCase(fieldType)) { 88 Long temp = Long.parseLong(value); 89 fieldSetMet.invoke(bean, temp); 90 } else if ("Double".equalsIgnoreCase(fieldType)) { 91 Double temp = Double.parseDouble(value); 92 fieldSetMet.invoke(bean, temp); 93 } else if ("Boolean".equalsIgnoreCase(fieldType)) { 94 Boolean temp = Boolean.parseBoolean(value); 95 fieldSetMet.invoke(bean, temp); 96 } else { 97 System.out.println("not supper type" + fieldType); 98 } 99 } 100 } catch (Exception e) { 101 continue; 102 } 103 } 104 105 } 106 107 /** 108 * 格式化string为Date 109 * @param datestr 110 * @return date 111 */ 112 public static Date parseDate(String datestr) { 113 if (null == datestr || "".equals(datestr)) { 114 return null; 115 } 116 try { 117 String fmtstr = null; 118 if (datestr.indexOf(':') > 0) { 119 fmtstr = "yyyy-MM-dd HH:mm:ss"; 120 } else { 121 122 fmtstr = "yyyy-MM-dd"; 123 } 124 SimpleDateFormat sdf = new SimpleDateFormat(fmtstr, Locale.UK); 125 return sdf.parse(datestr); 126 } catch (Exception e) { 127 return null; 128 } 129 } 130 131 /** 132 * 日期转化为String 133 * @param date 134 * @return date string 135 */ 136 public static String fmtDate(Date date) { 137 if (null == date) { 138 return null; 139 } 140 try { 141 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", 142 Locale.US); 143 return sdf.format(date); 144 } catch (Exception e) { 145 return null; 146 } 147 } 148 149 /** 150 * 判断是否存在某属性的 set方法 151 * @param methods 152 * @param fieldSetMet 153 * @return boolean 154 */ 155 public static boolean checkSetMet(Method[] methods, String fieldSetMet) { 156 for (Method met : methods) { 157 if (fieldSetMet.equals(met.getName())) { 158 return true; 159 } 160 } 161 return false; 162 } 163 164 /** 165 * 判断是否存在某属性的 get方法 166 * @param methods 167 * @param fieldGetMet 168 * @return boolean 169 */ 170 public static boolean checkGetMet(Method[] methods, String fieldGetMet) { 171 for (Method met : methods) { 172 if (fieldGetMet.equals(met.getName())) { 173 return true; 174 } 175 } 176 return false; 177 } 178 179 /** 180 * 拼接某属性的 get方法 181 * @param fieldName 182 * @return String 183 */ 184 public static String parGetName(String fieldName) { 185 if (null == fieldName || "".equals(fieldName)) { 186 return null; 187 } 188 int startIndex = 0; 189 if(fieldName.charAt(0)=='_') 190 startIndex = 1; 191 return "get" + fieldName.substring(startIndex, startIndex + 1).toUpperCase() 192 + fieldName.substring(startIndex + 1); 193 } 194 195 /** 196 * 拼接在某属性的 set方法 197 * @param fieldName 198 * @return String 199 */ 200 public static String parSetName(String fieldName) { 201 if (null == fieldName || "".equals(fieldName)) { 202 return null; 203 } 204 int startIndex = 0; 205 if(fieldName.charAt(0)=='_') 206 startIndex = 1; 207 return "set" + fieldName.substring(startIndex, startIndex + 1).toUpperCase() 208 + fieldName.substring(startIndex + 1); 209 } 210 211 /** 212 * 获取存储的键名称(调用parGetName) 213 * @param fieldName 214 * @return 去掉开头的get 215 */ 216 public static String parKeyName(String fieldName){ 217 String fieldGetName = parGetName(fieldName); 218 if(fieldGetName != null 219 && fieldGetName.trim() != "" 220 && fieldGetName.length() > 3){ 221 return fieldGetName.substring(3); 222 } 223 return fieldGetName; 224 } 225 226 }