Java反射 - 简单的给Bean赋值和取值

由于项目的实际需要,所以利用java反射原理写了一个简单给bean赋值和取值通用的类,在此记录下方便自己日后用到,也为需要的兄弟提供个参考例子。

工具类BeanRefUtil:

[java] view plain copy

print?

  1. package com.test;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. import java.util.HashMap;
  7. import java.util.Locale;
  8. import java.util.Map;
  9. /**
  10. * java bean 反射的方法
  11. */
  12. public class BeanRefUtil {
  13. /**
  14. * 取Bean的属性和值对应关系的MAP
  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. // 取出bean里的所有方法
  22. Method[] methods = cls.getDeclaredMethods();
  23. Field[] fields = cls.getDeclaredFields();
  24. for (Field field : fields) {
  25. try {
  26. String fieldType = field.getType().getSimpleName();
  27. String fieldGetName = parGetName(field.getName());
  28. if (!checkGetMet(methods, fieldGetName)) {
  29. continue;
  30. }
  31. Method fieldGetMet = cls
  32. .getMethod(fieldGetName, new Class[] {});
  33. Object fieldVal = fieldGetMet.invoke(bean, new Object[] {});
  34. String result = null;
  35. if ("Date".equals(fieldType)) {
  36. result = fmtDate((Date) fieldVal);
  37. } else {
  38. if (null != fieldVal) {
  39. result = String.valueOf(fieldVal);
  40. }
  41. }
  42. valueMap.put(field.getName(), result);
  43. } catch (Exception e) {
  44. continue;
  45. }
  46. }
  47. return valueMap;
  48. }
  49. /**
  50. * set属性的值到Bean
  51. * @param bean
  52. * @param valMap
  53. */
  54. public static void setFieldValue(Object bean, Map<String, String> valMap) {
  55. Class<?> cls = bean.getClass();
  56. // 取出bean里的所有方法
  57. Method[] methods = cls.getDeclaredMethods();
  58. Field[] fields = cls.getDeclaredFields();
  59. for (Field field : fields) {
  60. try {
  61. String fieldSetName = parSetName(field.getName());
  62. if (!checkSetMet(methods, fieldSetName)) {
  63. continue;
  64. }
  65. Method fieldSetMet = cls.getMethod(fieldSetName, field
  66. .getType());
  67. String value = valMap.get(field.getName());
  68. if (null != value && !"".equals(value)) {
  69. String fieldType = field.getType().getSimpleName();
  70. if ("String".equals(fieldType)) {
  71. fieldSetMet.invoke(bean, value);
  72. } else if ("Date".equals(fieldType)) {
  73. Date temp = parseDate(value);
  74. fieldSetMet.invoke(bean, temp);
  75. } else if ("Integer".equals(fieldType)
  76. || "int".equals(fieldType)) {
  77. Integer intval = Integer.parseInt(value);
  78. fieldSetMet.invoke(bean, intval);
  79. } else if ("Long".equalsIgnoreCase(fieldType)) {
  80. Long temp = Long.parseLong(value);
  81. fieldSetMet.invoke(bean, temp);
  82. } else if ("Double".equalsIgnoreCase(fieldType)) {
  83. Double temp = Double.parseDouble(value);
  84. fieldSetMet.invoke(bean, temp);
  85. } else if ("Boolean".equalsIgnoreCase(fieldType)) {
  86. Boolean temp = Boolean.parseBoolean(value);
  87. fieldSetMet.invoke(bean, temp);
  88. } else {
  89. System.out.println("not supper type" + fieldType);
  90. }
  91. }
  92. } catch (Exception e) {
  93. continue;
  94. }
  95. }
  96. }
  97. /**
  98. * 格式化string为Date
  99. * @param datestr
  100. * @return date
  101. */
  102. public static Date parseDate(String datestr) {
  103. if (null == datestr || "".equals(datestr)) {
  104. return null;
  105. }
  106. try {
  107. String fmtstr = null;
  108. if (datestr.indexOf(‘:‘) > 0) {
  109. fmtstr = "yyyy-MM-dd HH:mm:ss";
  110. } else {
  111. fmtstr = "yyyy-MM-dd";
  112. }
  113. SimpleDateFormat sdf = new SimpleDateFormat(fmtstr, Locale.UK);
  114. return sdf.parse(datestr);
  115. } catch (Exception e) {
  116. return null;
  117. }
  118. }
  119. /**
  120. * 日期转化为String
  121. * @param date
  122. * @return date string
  123. */
  124. public static String fmtDate(Date date) {
  125. if (null == date) {
  126. return null;
  127. }
  128. try {
  129. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
  130. Locale.US);
  131. return sdf.format(date);
  132. } catch (Exception e) {
  133. return null;
  134. }
  135. }
  136. /**
  137. * 判断是否存在某属性的 set方法
  138. * @param methods
  139. * @param fieldSetMet
  140. * @return boolean
  141. */
  142. public static boolean checkSetMet(Method[] methods, String fieldSetMet) {
  143. for (Method met : methods) {
  144. if (fieldSetMet.equals(met.getName())) {
  145. return true;
  146. }
  147. }
  148. return false;
  149. }
  150. /**
  151. * 判断是否存在某属性的 get方法
  152. * @param methods
  153. * @param fieldGetMet
  154. * @return boolean
  155. */
  156. public static boolean checkGetMet(Method[] methods, String fieldGetMet) {
  157. for (Method met : methods) {
  158. if (fieldGetMet.equals(met.getName())) {
  159. return true;
  160. }
  161. }
  162. return false;
  163. }
  164. /**
  165. * 拼接某属性的 get方法
  166. * @param fieldName
  167. * @return String
  168. */
  169. public static String parGetName(String fieldName) {
  170. if (null == fieldName || "".equals(fieldName)) {
  171. return null;
  172. }
  173. return "get" + fieldName.substring(0, 1).toUpperCase()
  174. + fieldName.substring(1);
  175. }
  176. /**
  177. * 拼接在某属性的 set方法
  178. * @param fieldName
  179. * @return String
  180. */
  181. public static String parSetName(String fieldName) {
  182. if (null == fieldName || "".equals(fieldName)) {
  183. return null;
  184. }
  185. return "set" + fieldName.substring(0, 1).toUpperCase()
  186. + fieldName.substring(1);
  187. }
  188. }
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 反射的方法  */  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);      }    }  

原文地址:https://www.cnblogs.com/jpfss/p/8985623.html

时间: 2024-10-12 08:34:02

Java反射 - 简单的给Bean赋值和取值的相关文章

2016.5.23 用反射技术为实体类变量赋值、取值

clobj是任意一个数据库表对应的实体类空白实例 TERMINAL_PRO clobj= new TERMINAL_PRO(); DataRow row = dtt.Rows[0]; Type t = clobj.GetType(); foreach (PropertyInfo pi in t.GetProperties()) //不用考虑属性的类型 { string name = pi.Name; //获得此属性名称 if (dtt.Columns.Contains(name)) { obje

java反射简单实现注入

做了好久的java开发 ,却一直没有详细了解java反射机制,后来写项目的时候发现用反射可以少写好多无聊的代码,因此用java反射简单实现注入. java反射的具体细节可参见 这篇博客写的非常详细,点此进入~ 而一般基于业务的编程主要用反射实现将属性动态的注入一个对象中. 以下是方法实现: 1 /** 2 * 根据 传入的map与类名,通过反射实例化对象 3 * @param className 需要实例化的类名 4 * @param map 包含属性的键值对 (String,Object) 5

关于ligerform中select与text的赋值与取值

如有下ligerform表单: var formData = [ { display: "区域", name: "QYYJ", newline: true, labelWidth: 100, width: 220, space: 2, type: "select", comboboxName: "QYYJName", options: { valueFieldID: "QYYJ" }, group: &qu

Java 中日期的几种常见操作 —— 取值、转换、加减、比较

Java 的开发过程中免不了与 Date 类型纠缠,准备总结一下项目经常使用的日期相关操作,JDK 版本 1.7,如果能够帮助大家节约那么几分钟起身活动一下,去泡杯咖啡,便是极好的,嘿嘿.当然,我只提供了可行的解决方案,并不保证是最佳实践,欢迎讨论. 1. 日期取值 在旧版本 JDK 的时代,有不少代码中日期取值利用了 java.util.Date 类,但是由于 Date 类不便于实现国际化,其实从 JDK1.1 开始,就更推荐使用 java.util.Calendar 类进行时间和日期方面的处

C# - 匿名对象属性的赋值与取值

在new出匿名对象的函数内可以直接调用该匿名对象的属性取值. 可是在其它函数就无法调用匿名对象的属性或方法. 这时,我们可以通过c#的反射机制取值: 文章出处:https://www.cnblogs.com/aucy/p/9102915.html ====================================================== C# 匿名对象的序列化 在开发的时候,经常遇到对象的序列化,尤其是在和外部系统交互的时候.在调用其他接口获得数据的时候大多都是json字符串,

JQuery里属性赋值,取值prop()和attr()方法?

1.赋值的时候 如果是<input type="checkbox" checked>这样的只有属性名就能生效的属性 推荐prop,即:$('input').prop('checked',true); 同时,false表示取消,即:$('input').prop('checked',false); 当然attr也行的:$('input').attr('checked','这里写什么都行的'); 取消属性就是移除:$('input').removeAttr('checked')

Android Json解析简单高效之org.json,取值如囊中取物

我们通常在Android上采用Gson来解析Json数据,很方便的就可以把数据转换成List或者map.当碰到日期时间的时候,你可能会遇到坑,需要格式化一下日期时间格式. 本文介绍org.json这种不需要导入任何包的解析方式,不管Json多少层,如探囊取物. 1.解析{"":""} 格式的 JSONObject 如何确认是这种格式,我们都不需要看,打开 http://json.cn (Json在线解析及格式化验证网站),把Json数据直接粘贴到左边,如果是正确的J

JQuery里input属性赋值,取值prop()和attr()方法?

一.赋值的时候 如果是<input type="checkbox" checked>这样的只有属性名就能生效的属性 推荐prop,即:$('input').prop('checked',true); 同时,false表示取消,即:$('input').prop('checked',false); 当然attr也行的:$('input').attr('checked','这里写什么都行的'); 取消属性就是移除:$('input').removeAttr('checked')

Java反射-简单应用

为了程序更好的维护和扩展,在面向对象思维的世界里,首先是面向接口编程,然后我们应该把做什么和怎么做进行分离. 下面我将用一个开晚会的例子来演示一下,最终达到的效果是:工厂+反射+配置文件实现程序的灵活应用.会具体说明一下这个过程是怎么来的,明白了这个,就会对反射和配置文件的结合更加深刻一些. 想要实现的功能是:晚会有一个唱歌.舞蹈.小品的节目单,具体各个节目的表演者只需要一个就可以,每一个表演接口都有两个实现类(表演者),通过客户端调用不同的实现类来实现不同的节目单.表演者就是"做什么"