java反射工具类--通过指定属性名,获取/设置对象属性值
2021-07-04 02:10
标签:har warnings system tool == cte append 对象 http java对象通过点运算符操作对象属性的方式没法使用for,while等循环,此工具主要解决这一问题. 例如:有一对象包含属性有一定规律 要将此对象拆为多个小对象 为了应对这种不能使用循环获取属性的情况,编写了此工具类 核心实现代码如下: set方法如下: get方法如下: 通过属性名获取get/set方法名: 完整代码:https://github.com/GFuZan/reflexTools java反射工具类--通过指定属性名,获取/设置对象属性值 标签:har warnings system tool == cte append 对象 http 原文地址:https://www.cnblogs.com/gfuzan/p/9614488.htmlobj1: {
name1: "张三",
age1: 1,
name2: "李四",
age2: 2,
....
}
objList:[
{
name: "张三",
age: 1
},
{
name: "李四",
age: 2
}
]
/**
* @param o
* 操作对象
* @param methodName
* 方法名
* @param attName
* 属性名
* @param value
* 值
* @return get方法返回实际值 set方法返回操作后对象
*/
private static Object Operation(Object o, String methodName, String attName, Class> paramType, Object value) {
// 方法赋值出错标志
boolean opErr = false;
Object res = null;
Class> type = o.getClass();
try {
Method method = null;
if (methodName.indexOf("get") != -1) {
// get方法
// 获取方法
method = type.getMethod(methodName);
// 执行
res = method.invoke(o);
} else {
// set方法
// 当没有传入参数类型时通过value获取参数类型
paramType = paramType == null ? value.getClass() : paramType;
// 获取方法
method = type.getMethod(methodName, paramType);
// 执行
method.invoke(o, value);
res = o;
}
} catch (Exception e) {
// 通过get/set方法操作属性失败
opErr = true;
if (SHOW_LOG) {
System.err.println(getThisName() + ": [WARN] 直接对属性‘" + attName + "进行操作(不借助get/set方法).");
}
}
if (opErr) {
// 通过打破封装方式直接对值进行操作
try {
Field field = null;
// 获取属性
field = type.getDeclaredField(attName);
// 打破封装
field.setAccessible(true);
if (methodName.indexOf("get") != -1) {
// get方法
// 获取属性值
res = field.get(o);
} else {
// set方法
// 设置属性值
field.set(o, value);
res = o;
}
} catch (Exception e) {
//两种方法都操作失败
if (SHOW_LOG) {
System.err.println(getThisName() + ": [ERROR] 属性‘" + attName + "‘操作失败.");
}
}
}
return res;
}
/**
* 设置属性值
*
* @param o
* 操作对象
* @param attName
* 属性名
* @param value
* 参数值
* @param paramType
* 参数类型
* @return 操作后对象
*/
@SuppressWarnings("unchecked")
public static
/**
* 获取属性值
*
* @param o
* 操作对象
* @param attName
* 属性名
* @param returnType
* 返回值类型
* @return
*/
@SuppressWarnings("unchecked")
public static
/**
* 属性名处理
*
* @param method
* 方法(get/set)
* @param attName
* @return
*/
private static String attNameHandle(String method, String attName) {
StringBuffer res = new StringBuffer(method);
// 属性只有一个字母
if (attName.length() == 1) {
res.append(attName.toUpperCase());
} else {
// 属性包含两个字母及以上
char[] charArray = attName.toCharArray();
// 当前两个字符为小写时,将首字母转换为大写
if (Character.isLowerCase(charArray[0]) && Character.isLowerCase(charArray[1])) {
res.append(Character.toUpperCase(charArray[0]));
res.append(attName.substring(1));
} else {
res.append(attName);
}
}
return res.toString();
}
文章标题:java反射工具类--通过指定属性名,获取/设置对象属性值
文章链接:http://soscw.com/index.php/essay/101531.html