由于项目的实际需要,所以利用java反射原理写了一个简单给bean赋值和取值通用的类,在此记录下方便自己日后用到,也为需要的兄弟提供个参考例子。
当然目前这个版本还有很多需要改进的地方,比如还没有添加对byte、char等的支持,主要是当前项目基本用不到这些类型,所以也没有多加考虑,以后会补上的。
直接附上java代码的:BeanRefUtil.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
package com.test; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Locale; import java.util.Map; /** * java bean 反射的方法 * @author Michael */ public class BeanRefUtil { /** * 取Bean的属性和值对应关系的MAP * @param bean * @return Map */ public static Map<String, String> getFieldValueMap(Object bean) { Class<?> cls = bean.getClass(); Map<String, String> valueMap = new HashMap<String, String>(); // 取出bean里的所有方法 Method[] methods = cls.getDeclaredMethods(); Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { try { String fieldType = field.getType().getSimpleName(); String fieldGetName = parGetName(field.getName()); if (!checkGetMet(methods, fieldGetName)) { continue; } Method fieldGetMet = cls .getMethod(fieldGetName, new Class[] {}); Object fieldVal = fieldGetMet.invoke(bean, new Object[] {}); String result = null; if ("Date".equals(fieldType)) { result = fmtDate((Date) fieldVal); } else { if (null != fieldVal) { result = String.valueOf(fieldVal); } } valueMap.put(field.getName(), result); } catch (Exception e) { continue; } } return valueMap; } /** * set属性的值到Bean * @param bean * @param valMap */ public static void setFieldValue(Object bean, Map<String, String> valMap) { Class<?> cls = bean.getClass(); // 取出bean里的所有方法 Method[] methods = cls.getDeclaredMethods(); Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { try { String fieldSetName = parSetName(field.getName()); if (!checkSetMet(methods, fieldSetName)) { continue; } Method fieldSetMet = cls.getMethod(fieldSetName, field .getType()); String value = valMap.get(field.getName()); if (null != value && !"".equals(value)) { String fieldType = field.getType().getSimpleName(); if ("String".equals(fieldType)) { fieldSetMet.invoke(bean, value); } else if ("Date".equals(fieldType)) { Date temp = parseDate(value); fieldSetMet.invoke(bean, temp); } else if ("Integer".equals(fieldType) || "int".equals(fieldType)) { Integer intval = Integer.parseInt(value); fieldSetMet.invoke(bean, intval); } else if ("Long".equalsIgnoreCase(fieldType)) { Long temp = Long.parseLong(value); fieldSetMet.invoke(bean, temp); } else if ("Double".equalsIgnoreCase(fieldType)) { Double temp = Double.parseDouble(value); fieldSetMet.invoke(bean, temp); } else if ("Boolean".equalsIgnoreCase(fieldType)) { Boolean temp = Boolean.parseBoolean(value); fieldSetMet.invoke(bean, temp); } else { System.out.println("not supper type" + fieldType); } } } catch (Exception e) { continue; } } } /** * 格式化string为Date * @param datestr * @return date */ public static Date parseDate(String datestr) { if (null == datestr || "".equals(datestr)) { return null; } try { String fmtstr = null; if (datestr.indexOf(':') > 0) { fmtstr = "yyyy-MM-dd HH:mm:ss"; } else { fmtstr = "yyyy-MM-dd"; } SimpleDateFormat sdf = new SimpleDateFormat(fmtstr, Locale.UK); return sdf.parse(datestr); } catch (Exception e) { return null; } } /** * 日期转化为String * @param date * @return date string */ public static String fmtDate(Date date) { if (null == date) { return null; } try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); return sdf.format(date); } catch (Exception e) { return null; } } /** * 判断是否存在某属性的 set方法 * @param methods * @param fieldSetMet * @return boolean */ public static boolean checkSetMet(Method[] methods, String fieldSetMet) { for (Method met : methods) { if (fieldSetMet.equals(met.getName())) { return true; } } return false; } /** * 判断是否存在某属性的 get方法 * @param methods * @param fieldGetMet * @return boolean */ public static boolean checkGetMet(Method[] methods, String fieldGetMet) { for (Method met : methods) { if (fieldGetMet.equals(met.getName())) { return true; } } return false; } /** * 拼接某属性的 get方法 * @param fieldName * @return String */ public static String parGetName(String fieldName) { if (null == fieldName || "".equals(fieldName)) { return null; } return "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); } /** * 拼接在某属性的 set方法 * @param fieldName * @return String */ public static String parSetName(String fieldName) { if (null == fieldName || "".equals(fieldName)) { return null; } return "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); } } |
一个Bean的类:TestBean.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package michael.reflect; import java.util.Date; public class TestBean { private String userName; private Integer age; private Double height; private Date date; private Long times; private Boolean flag; //getter setter 省略。。。 } |
一个测试的类:TestMain.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
package com.test; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; /** * * @author Michael * */ public class TestMain { /** * @param args */ public static void main(String[] args) { Map<String, String> valMap = new HashMap<String, String>(); valMap.put("userName", "michael"); valMap.put("age", "27"); valMap.put("height", "173.5"); valMap.put("date", "2010-10-24"); valMap.put("times", "1287932898276"); valMap.put("flag", "false"); TestBean testBean = new TestBean(); System.out.println("通过反射赋值."); BeanRefUtil.setFieldValue(testBean, valMap); System.out.println("通过反射取值:"); Map<String, String> fieldValMap = BeanRefUtil .getFieldValueMap(testBean); for (Entry<String, String> entry : fieldValMap.entrySet()) { System.out.println(entry.getKey() + "---" + entry.getValue()); } } } |
运行结果如下:
通过反射赋值.
通过反射取值:
flag—false
height—173.5
times—1287932898276
age—27
userName—michael
date—2010-10-24 00:00:00
原创文章,转载请注明: 转载自micmiu – 软件开发+生活点滴[ http://www.micmiu.com/ ]
你的checkSetMet方法和checkGetMet方法,内容是一样的。可以去掉一个。命名为checkMetExist类似。
setFieldValue那些类型判断可以去掉,Map泛型也可以放大到Map,泛型参数类型可通过ParameterizedTypegetActualTypeArguments()来动态获取。
不过个人认为在生产环境应用范围有限,主要是泛型的层次不确定,一般稍微复杂点的系统都好几层,多次循环取值不划算,还需要考虑到Array,具体类,比如Staff跟原始Object的判断等
根据场景 最合适才重要