利用java反照原理写了一个简单赋值和取值通用类
利用java反射原理写了一个简单赋值和取值通用类由于项目的实际需要,所以利用java反射原理写了一个简单给be
利用java反射原理写了一个简单赋值和取值通用类
由于项目的实际需要,所以利用java反射原理写了一个简单给bean赋值和取值通用的类,在此记录下方便自己日后用到,也为需要的兄弟提供个参考例子。?
?????当然目前这个版本还有很多需要改进的地方,比如还没有添加对byte、char等的支持,主要是当前项目基本用不到这些类型,所以也没有多加考虑,以后会补上的。?
直接附上java代码的:BeanRefUtil.java?
Java代码??
- 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);??
- ????}??
- ??
- }??
一个测试的类:TestMain.java?
Java代码??
- 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?
?
转载自:http://sjsky.iteye.com/blog/792819