反射的方式set和get对象中的属性值
动态的set
需求场景是这样的:问卷表里面只用了一个字段来存储一个题目的7个选项的答案,后台展示的时候需要解析出来,分别展示,最快捷的方法当然就是下面这种
//optionArr为存储选项的字段值通过split之后的数组
dto.setOption1(StrUtil.isBlank(optionArr[0]) ? "" : optionArr[0]);
dto.setOption2(StrUtil.isBlank(optionArr[1]) ? "" : optionArr[1]);
dto.setOption3(StrUtil.isBlank(optionArr[2]) ? "" : optionArr[2]);
......
//依次类推
后面找到了一种动态set的方式,方法如下
/**
* 动态set属性
*
* @param dto 调用对象
* @param name 需要set的字段
* @param value 需要set的值
*/
private void setValue(Object dto, String name, Object value) {
try {
Method[] m = dto.getClass().getMethods();
for (int i = 0; i < m.length; i++) {
if (("set" + name).toLowerCase().equals(m[i].getName().toLowerCase())) {
m[i].invoke(dto, value);
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
方法调用如下
if (!ArrayUtil.isEmpty(optionArr)) {
for (int i = 1; i <= optionArr.length; i++) {
setValue(dto, "option" + i, StrUtil.isBlank(optionArr[i - 1]) ? "" : optionArr[i - 1]);
}
}
动态的get
同样在前端新增一个题目时,也是传过来最多7个值,也需要把他们拼接成一个字符串然后再入库,也是依次动态的get属性值,空值就直接返回了,不会拼接到返回的字符串中
/**
* 动态get属性拼接成一个
* @param obj 调用对象
* @param name get字段前缀
* @return
*/
private String getOptionStr(Object obj, String name) {
StringBuilder optionStr = new StringBuilder();
for (int i = 1; i < optionMax; i++) {
String option = getValue(obj, name + i);
if (StrUtil.isBlank(option)) {
return optionStr.substring(0, optionStr.length() - 1);
}
optionStr.append(option).append(StrUtil.COMMA);
}
return optionStr.substring(0, optionStr.length() - 1);
}
private static String getValue(Object obj, String name) {
try {
Method m = (Method) obj.getClass().getMethod(("get" + name));
String val = (String) m.invoke(obj);
return val;
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
调用如下
String option = getOptionStr(dto, "Option")
dto.setOption(StrUtil.isBlank(option) ? "" : option);
我这里的对象属性名就是123456依次下来的,所以可以直接拼接i,具体情况还需合理变通,这些字段不是数据库的,我自己在对象里面新加的,方便前端直接取值
/**
* 选项A
*/
private String option1;
/**
* 选项B
*/
private String option2;
/**
* 选项C
*/
private String option3;
/**
* 选项D
*/
private String option4;
/**
* 选项E
*/
private String option5;
/**
* 选项F
*/
private String option6;