利用Java的反射机制,将一个实体类所有字段赋值为null

本文介绍了一种通过反射机制将实体类的所有字段设置为null的方法,并提供了两种实用的实现方式,一种是通过方法调用,另一种是直接操作字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何将一个实体类的所有字段设置为null

  1. 起因:在我们想要使用一个实体类的时候,如果发现创建这个类的时候,给某一些字段设置了初始值(某些场景下的特殊需要),但我们这个时候又不需要这些初始化值的时候,我们就会想要把这些值全部清除掉,让其变为一个干净的类,我们可以手动一个一个去赋null值,我一开始就是这么做的,同事看到后告诉我,你可以尝试使用反射机制,自己封装一个工具类,这样大家都可以使用,于是我就这么做了,也就有了下面比较low B 的代码:
  2. 我的代码:
public static void reflectClassValueToNull(Object model) throws Exception {
        
        //获取此类的所有父类
        List<Class<?>> 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 static <T> T 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 static <T> T 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;
    }

所以,差距你们看到了吗?反正我看到了!写到这里,也就结束了,如果对你们有所帮助,我很开心,没有,也感谢你们很有耐心的看到这里。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值