简简单单的反射和詹杜库放在一起就能好玩了吗?
背景
相信大家在日常的工作中,一定遇到过以下的某个场景: 前端需要选择某些字段,去展示不同字段下的信息,如果在字段和方法没有绑定的情况下,如何调用get方法呢? 如果有一张横转纵的表,存储的do都是实际的字段名称,那么如何转化成实体类对应的get、set方法去执行操作呢? 如果我想根据方法名称去调用对象的某个方法呢?
相信有些基础的程序员会立刻想到使用反射就好了,没错,就是这么简单,但是每用到一次,咱们就去写一次也是比较麻烦的,所以我们可以将它封装成工具类,用的时候直接去调用就好了。 实现
目前我在工具类实现了三个方法,分别是: 根据属性名调用对象get方法 根据属性名调用对象的set方法 根据方法名调用方法 根据属性名调用对象get方法
实现逻辑: 获取对象的class 获取对象的所有属性 获取对象的声明方法 遍历属性 匹配方法 invoke执行该方法 返回方法的返回值 /** * 根据属性名获取属性值 * * @return java.lang.String * @Param filedName * @Param obj * @Date 2022/12/15 15:06 * @Author wjbgn **/ public static String getObjField(String filedName, Object obj) { AtomicReference value = new AtomicReference<>(); Class<?> aClass = obj.getClass(); // 获取所有属性 Field[] declaredFields = aClass.getDeclaredFields(); // 获取所有方法 Method[] declaredMethods = aClass.getDeclaredMethods(); Arrays.stream(declaredFields).forEach(filed -> { if (filed.getName().equals(filedName)) { // 属性存在,尝试获取属性,调用get方法,此处get方法需要组装 Arrays.stream(declaredMethods).forEach(method -> { if (method.getName().toLowerCase().equals("get" + filedName)) { try { // 执行方法 Object invoke = method.invoke(obj); value.set(invoke == null ? null : invoke.toString()); } catch (Exception e) { throw new RuntimeException(e); } } }); } }); return value.get(); } 根据属性名调用对象的set方法
实现逻辑: 获取对象的声明方法 遍历方法 匹配方法名称 invoke执行该方法 /** * 根据属性名设置属性值 * * @return void * @Param filedName 字段名 * @Param value 字段值 * @Param obj 对象 * @Date 2022/12/15 14:41 * @Author wjbgn **/ public static void setObjField(String filedName, String value, Object obj) { Class<?> aClass = obj.getClass(); Arrays.stream(aClass.getDeclaredMethods()).forEach(method -> { if (method.getName().toLowerCase().equals("set" + filedName)) { try { method.invoke(obj, value); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } } }); } 根据方法名调用方法
实现逻辑: 获取对象的所有方法 -> 不同于获取get、set,此处需要获取所有的方法,包括实现和继承来的。 遍历方法 匹配方法名称 invoke执行该方法 返回方法返回值 /** * 根据方法名调用该方法 * * @return java.lang.Object * @Param filedName * @Param obj * @Date 2022/12/15 15:05 * @Author wjbgn **/ public static Object invokeMethod(String filedName, Object obj) { AtomicReference