您的位置:首页 > 编程语言 > Java开发

java反射调用set和get方法的通用类

2014-06-30 18:20 567 查看
我们有一个类的字段非常多,当我们要给遍历它的值或者说给它赋值时,最笨的方法是 每一个字段去set和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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: