java反射调用set和get方法的通用类
2014-06-30 18:20
567 查看
我们有一个类的字段非常多,当我们要给遍历它的值或者说给它赋值时,最笨的方法是 每一个字段去set和get。
这意味着我们可能要写几十个set和get。
那有没有更方便快捷的方法呢
针对这种情况,我们前面已经 写了遍历的方法 也就是通过反射get属性名和属性值的 方法 :
那set呢。
我们这次 找到了一个通用类,里面包含了set和get的方法:
使用方法:
set的使用方法:
假设User是我们的自定义类:
map中键装入类的字段名 值装入字段值:
get方法的使用:
这意味着我们可能要写几十个set和get。
那有没有更方便快捷的方法呢
针对这种情况,我们前面已经 写了遍历的方法 也就是通过反射get属性名和属性值的 方法 :
java中通过反射遍历属性字段及值
那set呢。
我们这次 找到了一个通用类,里面包含了set和get的方法:
package com.reallyinfo.ourea.util; 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; 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>(); 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); } } // String fieldKeyName = parKeyName(field.getName()); 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 fieldKeyName = parKeyName(field.getName()); String fieldKeyName = field.getName(); String value = valMap.get(fieldKeyName); 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; } int startIndex = 0; if (fieldName.charAt(0) == '_') startIndex = 1; return "get" + fieldName.substring(startIndex, startIndex + 1).toUpperCase() + fieldName.substring(startIndex + 1); } /** * 拼接在某属性的 set方法 * * @param fieldName * @return String */ public static String parSetName(String fieldName) { if (null == fieldName || "".equals(fieldName)) { return null; } int startIndex = 0; if (fieldName.charAt(0) == '_') startIndex = 1; return "set" + fieldName.substring(startIndex, startIndex + 1).toUpperCase() + fieldName.substring(startIndex + 1); } /** * 获取存储的键名称(调用parGetName) * * @param fieldName * @return 去掉开头的get */ public static String parKeyName(String fieldName) { String fieldGetName = parGetName(fieldName); if (fieldGetName != null && fieldGetName.trim() != "" && fieldGetName.length() > 3) { return fieldGetName.substring(3); } return fieldGetName; } }
使用方法:
set的使用方法:
假设User是我们的自定义类:
package com.reallyinfo.ourea.core.io; public class User { private String username; private String userpassword; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getUserpassword() { return userpassword; } public void setUserpassword(String userpassword) { this.userpassword = userpassword; } }
map中键装入类的字段名 值装入字段值:
Map<String,String> map = new HashMap<String, String>(); map.put("username","joe"); map.put("userpassword","123456"); User user = new User(); BeanRefUtil.setFieldValue(user, map);
get方法的使用:
Map<String, String> valueMap = BeanRefUtil.getFieldValueMap(user);
相关文章推荐
- java反射调用set和get方法的通用类
- java反射调用set和get方法的通用类
- java 反射调用Java类的私有set和get方法
- java使用反射调用set和get方法
- Java反射调用get方法和set方法
- java反射执行pojo中的set/get方法
- java中通过反射获取方法并且调用(getMethod和invoke深入)实践
- Java反射获取get和set方法
- Java通过PropertyDescriptor反射调用set和get方法
- java中通过反射获取方法并且调用(getMethod和invoke深入)实践
- Java---通过属性名反射获取get和set方法
- 通过反射动态调用set,get方法
- java通过反射得到get、set方法
- Java反射实体类属性(get ,set方法)
- Java反射代码--07.根据字段调用所有set方法
- java中通过反射获取方法并且调用(getMethod和invoke深入)实践
- 为什么java要用get,set方法替代域的直接调用?
- 反射调用get和set方法
- 反射调用 java bean的set和get方法
- 使用java反射中的getMethod,invoke方法调用对象方法的实例