摘要:然后告诉同事我写好了,让他帮忙优化一下毕竟他在我心里是一个真正的大牛,午休结束后,他发来了两个方法给我,以不同的方式实现,不过都是基于反射机制。
如何将一个实体类的所有字段设置为null
起因:在我们想要使用一个实体类的时候,如果发现创建这个类的时候,给某一些字段设置了初始值(某些场景下的特殊需要),但我们这个时候又不需要这些初始化值的时候,我们就会想要把这些值全部清除掉,让其变为一个干净的类,我们可以手动一个一个去赋null值,我一开始就是这么做的,同事看到后告诉我,你可以尝试使用反射机制,自己封装一个工具类,这样大家都可以使用,于是我就这么做了,也就有了下面比较low B 的代码:
我的代码:
public static void reflectClassValueToNull(Object model) throws Exception { //获取此类的所有父类 List> listSuperClass = Lists.newArrayList(); Class> superclass = model.getClass().getSuperclass(); while (superclass != null) { if (superclass.getName().equals("java.lang.Object")) { break; } listSuperClass.add(superclass); superclass = superclass.getSuperclass(); } //遍历处理所有父类的字段 for (Class> clazz : listSuperClass) { Field[] fields = clazz.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { String name = fields[i].getName(); Class type = fields[i].getType(); Method method = clazz.getMethod("set" + name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase()), type); method.invoke(model, new Object[]{null}); } } //处理此类自己的字段 Field[] fields = model.getClass().getDeclaredFields(); for (int i = 0; i < fields.length; i++) { String name = fields[i].getName(); Class type = fields[i].getType(); //获取属性的set方法 Method method = model.getClass().getMethod("set" + name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase()), type); //将值设为null method.invoke(model, new Object[]{null}); } }
代码写完的那一刻,真的很爽,虽然这个东西比较简单,但还是有一点成就感。然后告诉同事我写好了,让他帮忙优化一下(毕竟他在我心里是一个真正的大牛),午休结束后,他发来了两个方法给我,以不同的方式实现,不过都是基于反射机制。以下是他的代码:
第一个种方法:
public staticT byMethod(T t) { ReflectionUtils.getAllMethods(t.getClass(), method -> Objects.requireNonNull(method).getName().indexOf("set") == 0).forEach(method -> { try { method.invoke(t, new Object[]{null}); } catch (IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } }); return t; }
第二种方法:
public staticT byField(T t) { ReflectionUtils.getAllFields(t.getClass()).forEach(field -> { try { field.setAccessible(true); field.set(t, null); } catch (IllegalAccessException e) { throw new RuntimeException(e); } }); return t; }
所以,差距你们看到了吗?反正我看到了!写到这里,也就结束了,如果对你们有所帮助,我很开心,没有,也感谢你们很有耐心的看到这里。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68151.html
近期在维护公司项目的时候遇到一个问题,因为实体类中的 set 方法涉及到了业务逻辑,因此在给对象赋值的过程中不能够使用 set 方法,为了实现功能,所以采用了反射的机制给对象属性赋值,借此机会也了解了反射的一些具体用法和使用场景,分以下两点对反射进行分析: 反射的优势和劣势 反射的应用场景 反射的优势和劣势 个人理解,反射机制实际上就是上帝模式,如果说方法的调用是 Java 正确的打开方式...
摘要:与都继承自类,在中也是使用字符数组保存字符串,,这两种对象都是可变的。采用字节码的好处语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。 String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的? String和StringBuffer、StringBuilder的区别 可变性...
阅读 1626·2021-11-16 11:41
阅读 2441·2021-11-08 13:14
阅读 3064·2019-08-29 17:16
阅读 3057·2019-08-29 16:30
阅读 1805·2019-08-29 13:51
阅读 328·2019-08-23 18:38
阅读 3204·2019-08-23 17:14
阅读 613·2019-08-23 15:09