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

这篇具有很好参考价值的文章主要介绍了【Java】给实体每一个字段赋默认值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、初级版

1、工具类

2、实体类与测试代码

二、升级版-多层嵌套

1、工具类

2、实体类与测试代码

三、最终版-各种集合

1、工具类

2、实体类与测试代码


一、初级版

1、工具类

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

import java.lang.reflect.Field;

public class EntityDefaultValues {

    /**
     * 为指定实体类的所有字段赋默认值
     * @param entityClass 实体类的Class对象
     * @param <T> 实体类的类型
     * @throws IllegalAccessException 当访问实体类字段失败时抛出
     * @throws InstantiationException 当创建实体类实例失败时抛出
     */
    public static <T> T setDefaultValues(Class<T> 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;
    }

    /**
     * 获取指定数据类型的默认值
     * @param type 数据类型的Class对象
     * @return 数据类型的默认值
     */
    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 {

    /**
     * 为指定实体类的所有字段以及多层子实体类的字段赋默认值
     * @param entityClass 实体类的Class对象
     * @param <T> 实体类的类型
     * @throws IllegalAccessException 当访问实体类字段失败时抛出
     * @throws InstantiationException 当创建实体类实例失败时抛出
     */
    public static <T> T setDefaultValues(Class<T> 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;
    }

    /**
     * 获取指定数据类型的默认值
     * @param type 数据类型的Class对象
     * @return 数据类型的默认值
     */
    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 {

    /**
     * 为指定实体类的所有字段以及多层子实体类的字段、各种集合类型的字段赋默认值
     * @param entityClass 实体类的Class对象
     * @param <T> 实体类的类型
     * @throws IllegalAccessException 当访问实体类字段失败时抛出
     * @throws InstantiationException 当创建实体类实例失败时抛出
     */
    public static <T> T setDefaultValues(Class<T> 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;
    }
    
    /**
     * 获取指定数据类型的默认值
     * @param type 数据类型的Class对象
     * @return 数据类型的默认值
     */
    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<SubEntity> subEntityList;
    Map<String, SubEntity> 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<SubEntity> getSubEntityList() {
        return subEntityList;
    }

    public void setSubEntityList(List<SubEntity> subEntityList) {
        this.subEntityList = subEntityList;
    }

    public Map<String, SubEntity> getSubEntityMap() {
        return subEntityMap;
    }

    public void setSubEntityMap(Map<String, SubEntity> 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()); // 输出 {}
    }
}

java实体类字段设置默认值,# 随笔,java,开发语言

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

疑问、交流、鼓励请留言!文章来源地址https://www.toymoban.com/news/detail-726890.html

到了这里,关于【Java】给实体每一个字段赋默认值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java实体类属性和数据库字段都是大写字母,为什么返回给前端会变成小写字母

    最近我在开发系统的过程中发现了一个问题,我数据库中数据表的字段名使用的全是大写字母,Java实体类中属性也都是大写字母,但是返回给前端的时候所有属性名却变成了小写的。 我查阅资料后解决了问题,因此记录下来,避免以后再次踩坑。 数据库字段的字段名是大写

    2024年02月14日
    浏览(52)
  • Java判断一个实体是不是空的

    在Java中,我们可以使用以下方法来判断一个实体是否为空: 对象是否为null 可以使用Java中的 == 运算符来判断一个对象是否为null,如果对象为null,则表示对象为空。 例如: 字符串是否为空 可以使用Java中的 isEmpty() 方法来判断一个字符串是否为空,如果字符串为空,则返回

    2024年02月13日
    浏览(45)
  • java中用SXSSFWorkbook把多个字段的list数据和单个实体dto导出到excel如何导出到多个sheet页详细实例?

    要使用SXSSFWorkbook将多个字段的List数据和单个实体DTO导出到多个Sheet页,你可以按照以下步骤进行操作: 创建一个SXSSFWorkbook对象作为工作簿。 针对每个字段的List数据,创建一个新的Sheet页,并将数据写入该Sheet页。 创建一个新的Sheet页,用于单个实体DTO的数据。 将单个实体

    2024年02月11日
    浏览(46)
  • MySQL中如何为字段设置默认值?

    在MySQL中,我们可以为表的字段设置默认值,以确保在插入新记录时,如果没有为该字段指定值,将使用默认值。这在许多情况下都非常有用,特别是当我们希望在插入数据时自动填充某些字段,或者当我们想要为字段提供一个通用的默认值。 要为MySQL表中的字段设置默认值

    2024年02月08日
    浏览(46)
  • java怎么对对象的每一个字段都判空?

    可以通过反射机制,对 Java 对象中的每一个字段进行判空操作 我们定义了一个  isObjectFieldsNull  方法,该方法接受一个 Java 对象作为参数,使用反射机制遍历该对象中的每一个字段,如果有任何一个字段不为空,则返回  false ;如果所有字段都为空,则返回  true 。 需要注意

    2024年02月10日
    浏览(31)
  • mysql 将date字段默认值设置为CURRENT_DATE

    我们是否可以在mysql中,将Date字段的默认值设置为CURRENT_DATE(当前日期)? 答案是8.0之前不可以,8.0.13之后可以。 比如在5.7版本中使用如下sql创建表,将会提示语法错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

    2024年02月15日
    浏览(46)
  • 【java实习评审】对小说详情模块的更新判断以及数据库的商用字段设置比较到位

    大家好,本篇文章分享一下【校招VIP】免费商业项目“ 推推 ”第一期 书籍详情模块 java同学的文档作品。该同学来自【山西农业大学】软件工程专业。 本项目亮点难点: 1 热门书籍在更新点的访问压力 2 书籍更新通知的及时性和有效性 3 书荒:同好推荐的可能性 4 后期:定时

    2024年02月15日
    浏览(38)
  • Java8 Stream分组groupBy后,取单一字段值、取列表第一个值方式

    java8 Stream中groupBy的拓展用法。 取单一字段值、取列表第一个值方式

    2024年02月14日
    浏览(39)
  • Java 数据库改了一个字段, 前端传值后端接收为null问题解决

    前端传值后端为null的原因可能有很多种,我遇到一个问题是,数据库修改了一个字段,前端传值了,但是后台一直接收为null值, 原因排查: 1、字段没有匹配上,数据库字段和前端字段传值不一致 2、大小写一定要注意 这个疏忽大意了 以上都改了还是null ~~~~! 3、get set方法

    2024年02月10日
    浏览(94)
  • android studio创建一个新的项目为什么默认是kotlin语言而选择不了java语言

    关于android studio语言选择的问题。 我在进入android studio为什么创建一个新项目之后选择不了java语言有什么办法可以解决。 解决办法:这个模式下选着一个Empty Activity模块就可以使用java语言。 这对于刚刚接触anaroid studio新手比较管用。  

    2024年02月11日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包