利用java反射简化代码的一些思路

68 阅读2分钟

某日无聊时突然发觉自己写的屎山代码实在是又臭又长,实在不忍心污染工友的眼睛,又想到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完了