我們有一個類的欄位非常多,當我們要給遍歷它的值或者說給它賦值時,最笨的方法是 每一個欄位去set和get。
假如你現在還在為自己的技術擔憂,假如你現在想提升自己的工資,假如你想在職場上獲得更多的話語權,假如你想順利的度過35歲這個魔咒,假如你想體驗BAT的工作環境,那麼現在請我們一起開啟提升技術之旅吧,詳情請點選http://106.12.206.16:8080/qingruihappy/index.html
這意味著我們可能要寫幾十個set和get。
那有沒有更方便快捷的方法呢
針對這種情況,我們前面已經 寫了遍歷的方法 也就是通過反射get屬性名和屬性值的 方法 :
java中通過反射遍歷屬性欄位及值
那set呢。
我們這次 找到了一個通用類,裡面包含了set和get的方法:
1 package com.reallyinfo.ourea.util; 2 3 import java.lang.reflect.Field; 4 import java.lang.reflect.Method; 5 import java.text.SimpleDateFormat; 6 import java.util.Date; 7 import java.util.HashMap; 8 import java.util.Locale; 9 import java.util.Map; 10 11 public class BeanRefUtil { 12 /** 13 * 取Bean的屬性和值對應關係的MAP 14 * 15 * @param bean 16 * @return Map 17 */ 18 public static Map<String, String> getFieldValueMap(Object bean) { 19 Class<?> cls = bean.getClass(); 20 Map<String, String> valueMap = new HashMap<String, String>(); 21 Method[] methods = cls.getDeclaredMethods(); 22 Field[] fields = cls.getDeclaredFields(); 23 for (Field field : fields) { 24 try { 25 String fieldType = field.getType().getSimpleName(); 26 String fieldGetName = parGetName(field.getName()); 27 if (!checkGetMet(methods, fieldGetName)) { 28 continue; 29 } 30 Method fieldGetMet = cls.getMethod(fieldGetName, new Class[] {}); 31 Object fieldVal = fieldGetMet.invoke(bean, new Object[] {}); 32 String result = null; 33 if ("Date".equals(fieldType)) { 34 result = fmtDate((Date) fieldVal); 35 } else { 36 if (null != fieldVal) { 37 result = String.valueOf(fieldVal); 38 } 39 } 40 // String fieldKeyName = parKeyName(field.getName()); 41 valueMap.put(field.getName(), result); 42 } catch (Exception e) { 43 continue; 44 } 45 } 46 return valueMap; 47 } 48 49 /** 50 * set屬性的值到Bean 51 * 52 * @param bean 53 * @param valMap 54 */ 55 public static void setFieldValue(Object bean, Map<String, String> valMap) { 56 Class<?> cls = bean.getClass(); 57 // 取出bean裡的所有方法 58 Method[] methods = cls.getDeclaredMethods(); 59 Field[] fields = cls.getDeclaredFields(); 60 61 for (Field field : fields) { 62 try { 63 String fieldSetName = parSetName(field.getName()); 64 if (!checkSetMet(methods, fieldSetName)) { 65 continue; 66 } 67 Method fieldSetMet = cls.getMethod(fieldSetName, 68 field.getType()); 69 // String fieldKeyName = parKeyName(field.getName()); 70 String fieldKeyName = field.getName(); 71 String value = valMap.get(fieldKeyName); 72 if (null != value && !"".equals(value)) { 73 String fieldType = field.getType().getSimpleName(); 74 if ("String".equals(fieldType)) { 75 fieldSetMet.invoke(bean, value); 76 } else if ("Date".equals(fieldType)) { 77 Date temp = parseDate(value); 78 fieldSetMet.invoke(bean, temp); 79 } else if ("Integer".equals(fieldType) 80 || "int".equals(fieldType)) { 81 Integer intval = Integer.parseInt(value); 82 fieldSetMet.invoke(bean, intval); 83 } else if ("Long".equalsIgnoreCase(fieldType)) { 84 Long temp = Long.parseLong(value); 85 fieldSetMet.invoke(bean, temp); 86 } else if ("Double".equalsIgnoreCase(fieldType)) { 87 Double temp = Double.parseDouble(value); 88 fieldSetMet.invoke(bean, temp); 89 } else if ("Boolean".equalsIgnoreCase(fieldType)) { 90 Boolean temp = Boolean.parseBoolean(value); 91 fieldSetMet.invoke(bean, temp); 92 } else { 93 System.out.println("not supper type" + fieldType); 94 } 95 } 96 } catch (Exception e) { 97 continue; 98 } 99 } 100 } 101 102 /** 103 * 格式化string為Date 104 * 105 * @param datestr 106 * @return date 107 */ 108 public static Date parseDate(String datestr) { 109 if (null == datestr || "".equals(datestr)) { 110 return null; 111 } 112 try { 113 String fmtstr = null; 114 if (datestr.indexOf(':') > 0) { 115 fmtstr = "yyyy-MM-dd HH:mm:ss"; 116 } else { 117 fmtstr = "yyyy-MM-dd"; 118 } 119 SimpleDateFormat sdf = new SimpleDateFormat(fmtstr, Locale.UK); 120 return sdf.parse(datestr); 121 } catch (Exception e) { 122 return null; 123 } 124 } 125 126 /** 127 * 日期轉化為String 128 * 129 * @param date 130 * @return date string 131 */ 132 public static String fmtDate(Date date) { 133 if (null == date) { 134 return null; 135 } 136 try { 137 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", 138 Locale.US); 139 return sdf.format(date); 140 } catch (Exception e) { 141 return null; 142 } 143 } 144 145 /** 146 * 判斷是否存在某屬性的 set方法 147 * 148 * @param methods 149 * @param fieldSetMet 150 * @return boolean 151 */ 152 public static boolean checkSetMet(Method[] methods, String fieldSetMet) { 153 for (Method met : methods) { 154 if (fieldSetMet.equals(met.getName())) { 155 return true; 156 } 157 } 158 return false; 159 } 160 161 /** 162 * 判斷是否存在某屬性的 get方法 163 * 164 * @param methods 165 * @param fieldGetMet 166 * @return boolean 167 */ 168 public static boolean checkGetMet(Method[] methods, String fieldGetMet) { 169 for (Method met : methods) { 170 if (fieldGetMet.equals(met.getName())) { 171 return true; 172 } 173 } 174 return false; 175 } 176 177 /** 178 * 拼接某屬性的 get方法 179 * 180 * @param fieldName 181 * @return String 182 */ 183 public static String parGetName(String fieldName) { 184 if (null == fieldName || "".equals(fieldName)) { 185 return null; 186 } 187 int startIndex = 0; 188 if (fieldName.charAt(0) == '_') 189 startIndex = 1; 190 return "get" 191 + fieldName.substring(startIndex, startIndex + 1).toUpperCase() 192 + fieldName.substring(startIndex + 1); 193 } 194 195 /** 196 * 拼接在某屬性的 set方法 197 * 198 * @param fieldName 199 * @return String 200 */ 201 public static String parSetName(String fieldName) { 202 if (null == fieldName || "".equals(fieldName)) { 203 return null; 204 } 205 int startIndex = 0; 206 if (fieldName.charAt(0) == '_') 207 startIndex = 1; 208 return "set" 209 + fieldName.substring(startIndex, startIndex + 1).toUpperCase() 210 + fieldName.substring(startIndex + 1); 211 } 212 213 /** 214 * 獲取儲存的鍵名稱(呼叫parGetName) 215 * 216 * @param fieldName 217 * @return 去掉開頭的get 218 */ 219 public static String parKeyName(String fieldName) { 220 String fieldGetName = parGetName(fieldName); 221 if (fieldGetName != null && fieldGetName.trim() != "" 222 && fieldGetName.length() > 3) { 223 return fieldGetName.substring(3); 224 } 225 return fieldGetName; 226 } 227 228 }
使用方法:
set的使用方法:
假設User是我們的自定義類:
1 package com.reallyinfo.ourea.core.io; 2 3 public class User { 4 private String username; 5 private String userpassword; 6 7 public String getUsername() { 8 return username; 9 } 10 11 public void setUsername(String username) { 12 this.username = username; 13 } 14 15 public String getUserpassword() { 16 return userpassword; 17 } 18 19 public void setUserpassword(String userpassword) { 20 this.userpassword = userpassword; 21 } 22 23 }
map中鍵裝入類的欄位名 值裝入欄位值:set方法
1 Map<String,String> map = new HashMap<String, String>(); 2 map.put("username","joe"); 3 map.put("userpassword","123456"); 4 User user = new User(); 5 BeanRefUtil.setFieldValue(user, map);
get方法的使用:
1 Map<String, String> valueMap = BeanRefUtil.getFieldValueMap(user);