工具类与工具方法的区别:
- 工具方法适用于对同一对象进行较少次数的set与get
- 工具类适用于对同一对象进行较多次数的set与get
两个方法都自带异常处理机制,不会影响代码的后续运行,setter方法发生异常则相当于无效语句,getter方法发生异常则返回null值
注意 : 以下反射调用的方法都无视私有权限,但是只能调用本类实现的方法
工具方法------反射调用setter
使用方法 :
Person person= new Person ();
reflectSetter(person, "id", 1);
java代码 :
/**
* @param obj 需要被赋值的对象
* @param attr 对象的属性名
* @param value 被赋予的值
*/
public static void reflectSetter(Object obj, String attr, Object value) {
//获取对象类
Class cls = obj.getClass();
//获取方法集
Method[] methods = cls.getDeclaredMethods();
Method setter = null;
String setterRegex = "^set" + attr.toLowerCase();
//查找并执行setter方法
for (Method x : methods) {
String metdName = x.getName().toLowerCase();
if (metdName.matches(setterRegex)) {
setter = x;
}
}
if (setter == null)
System.err.println("没有找到对应属性名的setter");
else{
boolean flag = setter.isAccessible();
try {
setter.setAccessible(true);
setter.invoke(obj, value);
} catch (Exception e) {
System.err.println("设置属性值失败(可能是value类型不匹配)");
e.printStackTrace();
}finally {
setter.setAccessible(flag);
}
}
}
工具方法------反射调用getter
使用方法 :
Person person = new Person ();
Integer value = reflectGetter(person, "id",Integer.class);
java代码 :
/**
* @param obj 需要获取其值的对象
* @param attr 对象的属性名
* @param valueType 属性值的类型
*/
public static <T>T reflectGetter(Object obj, String attr, Class<T> valueType) {
//获取对象类
Class cls = obj.getClass();
//获取方法集
Method[] methods = cls.getDeclaredMethods();
Method getter = null;
String getterRegex = "^get" + attr.toLowerCase();
//查找并执行getter方法
for (Method x : methods) {
String metdName = x.getName().toLowerCase();
if (metdName.matches(getterRegex)) {
getter = x;
}
}
T value=null;
if (getter == null)
System.err.println("没有找到对应属性名的getter(返回null)");
else{
boolean flag = getter.isAccessible();
try {
getter.setAccessible(true);
value= valueType.cast(getter.invoke(obj));
} catch (ClassCastException e) {
e.printStackTrace();
System.err.println("属性值的类型不正确(返回null)");
} catch (Exception e) {
e.printStackTrace();
System.err.println("获取属性值失败(返回null)");
}finally {
getter.setAccessible(flag);
}
}
return value;
}
工具类------反射调用getter与setter
使用方法 :
Person person= new Person ();
ReflectTool handler = ReflectTool.getReflectHandler(person);//获取访问对象
handler.setter("ID", 12);//setter
Integer n = handler.getter("ID", Integer.class);//getter
java代码 :
public class ReflectTool {
private Class cls;
private Object obj;
private Map<String, Method> getterMethods;
private Map<String, Method> setterMethods;
public static ReflectTool reflectToolFactory(Object obj) {
return new ReflectTool(obj);
}
private ReflectTool(Object obj) {
this.obj = obj;
this.cls = obj.getClass();
this.getterMethods = new HashMap<>();
this.setterMethods = new HashMap<>();
//获取方法集
Method[] methods = cls.getDeclaredMethods();
String setterRegex = "^set[a-zA-Z_$0-9]+";
String getterRegex = "^get[a-zA-Z_$0-9]+";
//初始化getter与setter方法集
for (Method x : methods) {
boolean flag=x.isAccessible();
x.setAccessible(true);
String metdName = x.getName().toLowerCase();
if (metdName.matches(setterRegex)) {
String attrName = metdName.replaceFirst("set", "");
this.setterMethods.put(attrName, x);
} else if (metdName.matches(getterRegex)) {
String attrName = metdName.replaceFirst("get", "");
this.getterMethods.put(attrName, x);
}
x.setAccessible(flag);
}
}
/**
* @param attr 对象的属性名
* @param value 被赋予的值
*/
public void setter(String attr, Object value) {
Method setter = setterMethods.get(attr.toLowerCase());
if (setter == null)
System.err.println("没有找到对应属性名的setter");
else {
boolean flag = setter.isAccessible();
try {
setter.setAccessible(true);
setter.invoke(obj, value);
} catch (Exception e) {
System.err.println("设置属性值失败(可能是value类型不匹配)");
e.printStackTrace();
} finally {
setter.setAccessible(flag);
}
}
}
/**
* @param attr 对象的属性名
* @param valueType 属性值的类型
*/
public <T> T getter(String attr, Class<T> valueType) {
Method getter = getterMethods.get(attr.toLowerCase());
T value = null;
if (getter == null)
System.err.println("没有找到对应属性名的getter(返回null)");
else {
boolean flag = getter.isAccessible();
try {
getter.setAccessible(true);
value = valueType.cast(getter.invoke(obj));
} catch (ClassCastException e) {
e.printStackTrace();
System.err.println("属性值的类型不正确(返回null)");
} catch (Exception e) {
e.printStackTrace();
System.err.println("获取属性值失败(返回null)");
} finally {
getter.setAccessible(flag);
}
}
return value;
}
}