程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java反射原理 一個簡單賦值和取值通用類

java反射原理 一個簡單賦值和取值通用類

編輯:關於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 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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved