【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()); // 输出 {}
    }
}

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

疑问、交流、鼓励请留言!文章来源地址https://uudwc.com/A/BvPPW

原文地址:https://blog.csdn.net/libusi001/article/details/131383420

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

h
上一篇 2023年10月14日 21:24
熟悉MySQL和HDFS操作
下一篇 2023年10月15日 00:24