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,开发语言

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

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

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

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

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

相关文章

  • Springboot-- 注解字段校验,并统一设置返回值

    引包: import org.springframework.validation.annotation.Validated; 规则 @AssertFalse Boolean,boolean 验证注解的元素值是false @AssertTrue Boolean,boolean 验证注解的元素值是true @NotNull 任意类型 验证注解的元素值不是null @Null 任意类型 验证注解的元素值是null @Min(value=值) BigDecimal,BigInteger, byte,short,

    2024年02月11日
    浏览(52)
  • 【Java】在实体类中常用的注解校验

    注解 说明 @Null 只能为null @NotNull(message = “id不能为空”) 必须不为null,可以为空字符串 @Min(value) 必须为一个不小于指定值的数字 @Max(value) 必须为一个不大于指定值的数字 @NotBlank(message = “姓名不能为空”) 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同

    2024年02月04日
    浏览(87)
  • 如何在SpringBoot中使用@Value注解来设置默认值

    👽👽👽在Spring Boot中,使用@Value注解可以为属性设置默认值。 @Value注解可以用于注入以下类型的属性: 1、基本数据类型(如字符串、整数、浮点数等) 2、基本数据类型的数组 3、集合类型(如List、Set等) 4、自定义数据类型,包括自定义对象和自定义对象的集合 5、Spri

    2024年02月11日
    浏览(36)
  • 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】Mybatis查询数据库返回JSON格式的字段映射到实体类属性

    今天遇到了一个bug,大概就是数据库(Mysql)中有一个 type 类型字段,数据类型为json,大概是这样的:[“苹果”,“香蕉”,“葡萄”]的数据格式,这个bug的问题所在呢就是查询后这个json格式的数据无法映射到我们实体类的属性上,解决方案如下: 实体类的配置: @TableField

    2024年02月15日
    浏览(48)
  • rocketmq消息注解基于springboot的简单应用及默认详细配置

            rocketmq消息组件在springboot框架中的应用,使用rocketmq的整合包进行编码实现。 引入rocketmq依赖jar, 最新版本参考GitHub - apache/rocketmq-spring: Apache RocketMQ Spring Integration 基本配置 rocketmq.name-server:  rocketmq集群地址,单点或集群 rocketmq.producer.group : 生产者组名,用于标识一组

    2024年02月12日
    浏览(40)
  • 【Kotlin】Kotlin 与 Java 互操作 ② ( @JvmField 注解字段给 Java | @JvmOverloads 注解修饰函数 | @JvmStatic 注解声明静态成员 )

    在 Java 中是 不能直接访问 Kotlin 中的字段 的 , 必须 调用相应的 Getter 和 Setter 方法 , 才能进行访问 ; 代码示例 : Kotlin 类 : 在 Kotlin 中声明的成员属性 , 默认就是 private 私有属性 , 默认为其生成了 Getter 和 Setter 方法 ; Java 类直接调用 : 在 Java 类中 , 不能直接调用 Kotlin 字段 ; 在

    2024年02月02日
    浏览(35)
  • 【clickhouse实践】clickhouse如何在查询中对某字段空值设置默认值及对Nullable值的处理

    在ClickHouse中,我们可以使用一些函数来处理可空性(nullable)列。可空列是指允许包含空值(null)的列。在处理可空列时,我们需要考虑如何处理这些空值。以下是几个常用的ClickHouse函数,用于处理可空性列。 IFNULL 函数用于将一个可空性列中的空值替换为指定的默认值。它

    2024年02月12日
    浏览(41)
  • java中将一个实体类复制到另一个实体类的三种方法

    这两天在做发票识别时,遇到一个问题,有一张发票表(假设为invoice_OCR_success)和一张我根据发票表新建的表(假设为invoice_OCR_fail),两张表有些字段名是相同的,有时需要把其中一张表的实例在另一张表里保存一份,此时就用到了实体类的复制,以下我将列出三种尝试的

    2024年02月13日
    浏览(49)
  • Java实体类属性和数据库字段都是大写字母,为什么返回给前端会变成小写字母

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

    2024年02月14日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包