一、说明
我们经常会遇到一些很多字段的实体类,如果一个一个去 set 值或者 get 值,重复代码量实在太多,非常不方便。如果利用反射机制,就可以将类中所有字段提取出来,放到一个 Field 数组中,在去遍历这个数组,取出每一个 Field 的 name ,通过这个 name ,就可以调用 getter 和 setter 方法,非常方便。接下来,我们写几个常用的方法做一个工具类。
二、工具类代码
import java.lang.reflect.Method;
import java.math.BigDecimal;
/**
* java 反射工具类
*/
public class ClassMethodUtil {
/**
* 根据属性,获取get方法
*
* @param ob 对象
* @param name 属性名
* @return
* @throws Exception
*/
public static Object getGetMethod(Object ob, String name) throws Exception {
Method[] m = ob.getClass().getMethods();
for (int i = 0; i < m.length; i++) {
if (("get" + name).toLowerCase().equals(m[i].getName().toLowerCase())) {
return m[i].invoke(ob);
}
}
return null;
}
/**
* 根据属性,拿到set方法,并把值set到对象中
*
* @param obj 对象
* @param clazz 对象的class
* @param filedName 需要设置值得属性
* @param typeClass
* @param value
*/
public static void setValue(Object obj, Class<?> clazz, String filedName, Class<?> typeClass, Object value) {
filedName = removeLine(filedName);
String methodName = "set" + filedName.substring(0, 1).toUpperCase() + filedName.substring(1);
try {
Method method = clazz.getDeclaredMethod(methodName, new Class[]{typeClass});
method.invoke(obj, new Object[]{getClassTypeValue(typeClass, value)});
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* 通过class类型获取获取对应类型的值
*
* @param typeClass class类型
* @param value 值
* @return Object
*/
private static Object getClassTypeValue(Class<?> typeClass, Object value) {
if (typeClass == int.class || value instanceof Integer) {
if (null == value) {
return 0;
}
return value;
} else if (typeClass == short.class) {
if (null == value) {
return 0;
}
return value;
} else if (typeClass == byte.class) {
if (null == value) {
return 0;
}
return value;
} else if (typeClass == double.class) {
if (null == value) {
return 0;
}
return value;
} else if (typeClass == long.class) {
if (null == value) {
return 0;
}
return value;
} else if (typeClass == String.class) {
if (null == value) {
return "";
}
return value;
} else if (typeClass == boolean.class) {
if (null == value) {
return true;
}
return value;
} else if (typeClass == BigDecimal.class) {
if (null == value) {
return new BigDecimal(0);
}
return new BigDecimal(value + "");
} else {
return typeClass.cast(value);
}
}
/**
* 处理字符串 如: abc_dex ---> abcDex
*
* @param str
* @return
*/
public static String removeLine(String str) {
if (null != str && str.contains("_")) {
int i = str.indexOf("_");
char ch = str.charAt(i + 1);
char newCh = (ch + "").substring(0, 1).toUpperCase().toCharArray()[0];
String newStr = str.replace(str.charAt(i + 1), newCh);
String newStr2 = newStr.replace("_", "");
return newStr2;
}
return str;
}
}
网友评论