由於項目的實際需要,所以利用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 getFIEldValueMap(Object bean) {
Class cls = bean.getClass();
Map valueMap = new HashMap();
// 取出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 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 valMap = new HashMap();
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 fIEldValMap = BeanRefUtil
.getFIEldValueMap(testBean);
for (Entry 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