文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java给实体每一个字段赋默认值

2023-08-31 20:05

关注

目录

一、初级版

1、工具类

2、实体类与测试代码

二、升级版-多层嵌套

1、工具类

2、实体类与测试代码

三、最终版-各种集合

1、工具类

2、实体类与测试代码


一、初级版

1、工具类

        使用反射机制实现任意实体类字段的默认值赋值功能

import java.lang.reflect.Field;public class EntityDefaultValues {        public static  T setDefaultValues(Class entityClass) throws IllegalAccessException, InstantiationException {        // 使用newInstance方法创建实体类的实例        T entity = entityClass.newInstance();        // 获取实体类的所有字段        Field[] fields = entityClass.getDeclaredFields();        // 遍历所有字段并为其赋默认值        for(Field field : fields){            field.setAccessible(true);            Object value = getDefaultFieldValue(field.getType());            field.set(entity, value);        }        return entity;    }        private static Object getDefaultFieldValue(Class type) {        if(type == int.class || type == Integer.class){            return 0;        }else if(type == long.class || type == Long.class){            return 0L;        }else if(type == float.class || type == Float.class){            return 0.0F;        }else if(type == double.class || type == Double.class){            return 0.0D;        }else if(type == byte.class || type == Byte.class){            return (byte)0;        }else if(type == short.class || type == Short.class){            return (short)0;        }else if(type == boolean.class || type == Boolean.class){            return false;        }else if(type == char.class || type == Character.class){            return '\u0000';        }else{            return null; // 引用类型默认为null        }    }}

2、实体类与测试代码

        使用EntityDefaultValues工具类为TestEntity实体类的所有字段赋默认值,并输出结果。需要注意的是,使用该工具类前,必须为实体类的所有字段添加了getter和setter方法。

public class TestEntity {    int id;    String name;    boolean finished;    // 构造函数省略    // 必须添加getter和setter方法    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public boolean isFinished() {        return finished;    }    public void setFinished(boolean finished) {        this.finished = finished;    }}// 测试public class Test {    public static void main(String[] args) throws IllegalAccessException, InstantiationException {        TestEntity entity = EntityDefaultValues.setDefaultValues(TestEntity.class);        System.out.println(entity.getId()); // 输出 0        System.out.println(entity.getName()); // 输出 null        System.out.println(entity.isFinished()); // 输出 false    }}

二、升级版-多层嵌套

        实体包含多层嵌套的子实体,可以通过递归的方式,为所有子实体和子实体的字段赋默认值。以下是扩展后的工具类代码

1、工具类

        此工具类代码实现了为任意实体类的所有字段以及多层子实体类的所有字段赋默认值的功能。使用方法与上面的示例相同,需要注意的是,使用该工具类前,必须为实体类的所有字段添加了getter和setter方法。同时,在进行递归时,需要判断子实体类的类型是否具有ClassLoader属性,以此来判断其是否是一个实体类。如果是实体类,则使用递归方式为子实体类的字段赋默认值。

import java.lang.reflect.Field;public class EntityDefaultValues {        public static  T setDefaultValues(Class entityClass) throws IllegalAccessException, InstantiationException {        // 使用newInstance方法创建实体类的实例        T entity = entityClass.newInstance();        // 获取实体类的所有字段        Field[] fields = entityClass.getDeclaredFields();        // 遍历所有字段并为其赋默认值        for(Field field : fields){            field.setAccessible(true);            // 如果该字段是一个实体类            if(field.getType().getClassLoader() != null){                // 使用递归方式为子实体类的字段赋默认值                Object subEntity = setDefaultValues(field.getType());                field.set(entity, subEntity);            }else{                Object value = getDefaultFieldValue(field.getType());                field.set(entity, value);            }        }        return entity;    }        private static Object getDefaultFieldValue(Class type) {        if(type == int.class || type == Integer.class){            return 0;        }else if(type == long.class || type == Long.class){            return 0L;        }else if(type == float.class || type == Float.class){            return 0.0F;        }else if(type == double.class || type == Double.class){            return 0.0D;        }else if(type == byte.class || type == Byte.class){            return (byte)0;        }else if(type == short.class || type == Short.class){            return (short)0;        }else if(type == boolean.class || type == Boolean.class){            return false;        }else if(type == char.class || type == Character.class){            return '\u0000';        }else{            return null; // 引用类型默认为null        }    }}

2、实体类与测试代码

        使用EntityDefaultValues工具类为TestEntity实体类及其内部SubEntity子实体类的所有字段赋默认值。结果输出默认的数值类型、字符类型和布尔类型的默认值,日期类型为null,引用类型也为null。

public class TestEntity {    int id;    String name;    boolean finished;    Date createTime;    SubEntity subEntity;    // 构造函数省略    // 必须添加getter和setter方法    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public boolean isFinished() {        return finished;    }    public void setFinished(boolean finished) {        this.finished = finished;    }    public Date getCreateTime() {        return createTime;    }    public void setCreateTime(Date createTime) {        this.createTime = createTime;    }    public SubEntity getSubEntity() {        return subEntity;    }    public void setSubEntity(SubEntity subEntity) {        this.subEntity = subEntity;    }}public class SubEntity {    int subId;    String subName;    // 构造函数省略    // 必须添加getter和setter方法    public int getSubId() {        return subId;    }    public void setSubId(int subId) {        this.subId = subId;    }    public String getSubName() {        return subName;    }    public void setSubName(String subName) {        this.subName = subName;    }}// 测试public class Test {    public static void main(String[] args) throws IllegalAccessException, InstantiationException {        TestEntity entity = EntityDefaultValues.setDefaultValues(TestEntity.class);        System.out.println(entity.getId()); // 输出 0        System.out.println(entity.getName()); // 输出 null        System.out.println(entity.isFinished()); // 输出 false        System.out.println(entity.getCreateTime()); // 输出 null        System.out.println(entity.getSubEntity().getSubId()); // 输出 0        System.out.println(entity.getSubEntity().getSubName()); // 输出 null    }}

三、最终版-各种集合

1、工具类

        工具类代码实现了为任意实体类的所有字段以及多层子实体类的所有字段、各种类型的集合字段赋默认值,需要注意的是,使用该工具类前,必须为实体类的所有字段添加了getter和setter方法。同时,在进行递归时,需要判断子实体类的类型是否具有ClassLoader属性,以此来判断其是否是一个实体类。对于各种类型的集合字段,需要通过判断集合的具体实现类来确定其默认值及具体实现类。对于基本类型和引用类型的字段,可以使用getDefaultFieldValue()方法获取其默认值。

import java.lang.reflect.Field;import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.List;import java.util.Map;public class EntityDefaultValues {        public static  T setDefaultValues(Class entityClass) throws IllegalAccessException, InstantiationException {        // 使用newInstance方法创建实体类的实例        T entity = entityClass.newInstance();        // 获取实体类的所有字段        Field[] fields = entityClass.getDeclaredFields();        // 遍历所有字段并为其赋默认值        for(Field field : fields){            field.setAccessible(true);            Object value = null;            Class fieldType = field.getType();            // 如果该字段是一个集合类型            if(Collection.class.isAssignableFrom(fieldType)){                // 判断集合类型的具体实现类                if(List.class.isAssignableFrom(fieldType)){                    // 创建一个空的List对象                    value = new ArrayList<>();                }else if(Map.class.isAssignableFrom(fieldType)){                    // 创建一个空的HashMap对象                    value = new HashMap<>();                }else{                    // 其他类型的集合使用空的Collection对象                    value = new ArrayList<>();                }                field.set(entity, value);            }            // 如果该字段是一个实体类            else if(fieldType.getClassLoader() != null){                // 使用递归方式为子实体类的字段赋默认值                Object subEntity = setDefaultValues(fieldType);                field.set(entity, subEntity);            }            // 如果该字段是一个基本类型或引用类型            else{                value = getDefaultFieldValue(fieldType);                field.set(entity, value);            }        }        return entity;    }            private static Object getDefaultFieldValue(Class type) {        if(type == int.class || type == Integer.class){            return 0;        }else if(type == long.class || type == Long.class){            return 0L;        }else if(type == float.class || type == Float.class){            return 0.0F;        }else if(type == double.class || type == Double.class){            return 0.0D;        }else if(type == byte.class || type == Byte.class){            return (byte)0;        }else if(type == short.class || type == Short.class){            return (short)0;        }else if(type == boolean.class || type == Boolean.class){            return false;        }else if(type == char.class || type == Character.class){            return '\u0000';        }else{            return null; // 引用类型默认为null        }    }}

2、实体类与测试代码

        使用EntityDefaultValues工具类为TestEntity实体类及其内部SubEntity子实体类的所有字段赋默认值。结果输出默认的数值类型、字符类型和布尔类型的默认值,日期类型为null,引用类型也为null,List和Map类型为默认的空集合对象。需要注意的是,在进行递归时,需要判断子实体类的类型是否具有ClassLoader属性,以此来判断其是否是一个实体类。如果是实体类,则使用递归方式为子实体类的字段赋默认值。同时,在为List和Map类型的字段赋默认值时,需要通过判断集合的具体实现类来确定其默认值及具体实现类。

import java.util.Date;import java.util.List;import java.util.Map;public class TestEntity {    int id;    String name;    boolean finished;    Date createTime;    SubEntity subEntity;    List subEntityList;    Map subEntityMap;    // 构造函数省略    // 必须添加getter和setter方法    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public boolean isFinished() {        return finished;    }    public void setFinished(boolean finished) {        this.finished = finished;    }    public Date getCreateTime() {        return createTime;    }    public void setCreateTime(Date createTime) {        this.createTime = createTime;    }    public SubEntity getSubEntity() {        return subEntity;    }    public void setSubEntity(SubEntity subEntity) {        this.subEntity = subEntity;    }    public List getSubEntityList() {        return subEntityList;    }    public void setSubEntityList(List subEntityList) {        this.subEntityList = subEntityList;    }    public Map getSubEntityMap() {        return subEntityMap;    }    public void setSubEntityMap(Map subEntityMap) {        this.subEntityMap = subEntityMap;    }}public class SubEntity {    int subId;    String subName;    // 构造函数省略    // 必须添加getter和setter方法    public int getSubId() {        return subId;    }    public void setSubId(int subId) {        this.subId = subId;    }    public String getSubName() {        return subName;    }    public void setSubName(String subName) {        this.subName = subName;    }}// 测试public class Test {    public static void main(String[] args) throws IllegalAccessException, InstantiationException {        TestEntity entity = EntityDefaultValues.setDefaultValues(TestEntity.class);        System.out.println(entity.getId()); // 输出 0        System.out.println(entity.getName()); // 输出 null        System.out.println(entity.isFinished()); // 输出 false        System.out.println(entity.getCreateTime()); // 输出 null        System.out.println(entity.getSubEntity().getSubId()); // 输出 0        System.out.println(entity.getSubEntity().getSubName()); // 输出 null        System.out.println(entity.getSubEntityList()); // 输出 []        System.out.println(entity.getSubEntityMap()); // 输出 {}    }}

有用请点赞,养成良好习惯!

疑问、交流、鼓励请留言!

来源地址:https://blog.csdn.net/libusi001/article/details/131383420

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯