某日无聊时突然发觉自己写的屎山代码实在是又臭又长,实在不忍心污染工友的眼睛,又想到java还有反射这个好玩意,遂开始做改进。 ————————————————————————————————
首先就是从需求出发,我的需求就是简化set函数的过程,每次将数据封装成对象存储进数据库占用太多空间辣!真是辣眼睛比如...
Agreement agreement = new Agreement();
agreement.setFormid(formid);
agreement.setTitle(title);
agreement.setContent(content);
agreement.setShowNum(showNum);
agreement.setAgree(agree);
agreement.setDisagree(disagree);
agreement.setShortestReadingTimeEasy(i);
agreement.setSeconds(seconds);
我的想法就是 通过反射机制写出一坨新鲜大粪一个方法,传入类,参数名,参数值可以自动完成set方法。就像这样!
private void setValue(Object target, String name, Object value){}
可是现实总是很骨感QAQ首先就是我并不清楚一共有多少值需要set(在不知道具体是哪个服务层方法的情况下)。遂开始完成第一个小目标!!!得到需要set的值的名字与它的值。首先就是将名字与值相对应。这一步其实还算比较简单 假设前端传入的是一个json格式的字符串,那我们就可以通过jackson库的亿点点黑魔法,将这个字符串直接解析为map
Map<String, Object> map = objectMapper.readValue(hiahiahia, new TypeReference<Map<String,Object>>(){});
第二步就是开始设值啦 我们又面临了另一个难题,就是将set方法对应住值,这里我用的是字符串拼接的方法
if (("set" + name).equalsIgnoreCase(method.getName())) {
method.invoke(target, value);
}
这里要用全小写比较的原因是 驼峰命名的第一个参数难免是小写 所以直接比较全小写形态就方便多啦~
想到了这一步,其他的都小菜一叠
try {
Method[] methods = target.getClass().getMethods();
// 得到具体类的方法列表
for (Method method : methods) {
if (("set" + name).equalsIgnoreCase(method.getName())) {
// 执行具体的set方法
method.invoke(target, value);
}
}
}
catch (Exception e) {
e.printStackTrace();
}
然鹅写完才想到其实多整几个构造方法,一行就能set完了