欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java給實(shí)體每一個(gè)字段賦默認(rèn)值詳細(xì)代碼示例

 更新時(shí)間:2023年09月07日 11:18:37   作者:慕白Lee  
這篇文章主要給大家介紹了關(guān)于Java給實(shí)體每一個(gè)字段賦默認(rèn)值的相關(guān)資料,在編程過程中有時(shí)會(huì)出現(xiàn)這樣一種情況,在查詢無結(jié)果時(shí)我們需要給實(shí)體賦默認(rèn)值,需要的朋友可以參考下

一、初級(jí)版

1、工具類

使用反射機(jī)制實(shí)現(xiàn)任意實(shí)體類字段的默認(rèn)值賦值功能

import java.lang.reflect.Field;
public class EntityDefaultValues {
    /**
     * 為指定實(shí)體類的所有字段賦默認(rèn)值
     * @param entityClass 實(shí)體類的Class對(duì)象
     * @param <T> 實(shí)體類的類型
     * @throws IllegalAccessException 當(dāng)訪問實(shí)體類字段失敗時(shí)拋出
     * @throws InstantiationException 當(dāng)創(chuàng)建實(shí)體類實(shí)例失敗時(shí)拋出
     */
    public static <T> T setDefaultValues(Class<T> entityClass) throws IllegalAccessException, InstantiationException {
        // 使用newInstance方法創(chuàng)建實(shí)體類的實(shí)例
        T entity = entityClass.newInstance();
        // 獲取實(shí)體類的所有字段
        Field[] fields = entityClass.getDeclaredFields();
        // 遍歷所有字段并為其賦默認(rèn)值
        for(Field field : fields){
            field.setAccessible(true);
            Object value = getDefaultFieldValue(field.getType());
            field.set(entity, value);
        }
        return entity;
    }
    /**
     * 獲取指定數(shù)據(jù)類型的默認(rèn)值
     * @param type 數(shù)據(jù)類型的Class對(duì)象
     * @return 數(shù)據(jù)類型的默認(rèn)值
     */
    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; // 引用類型默認(rèn)為null
        }
    }
}

2、實(shí)體類與測(cè)試代碼

使用EntityDefaultValues工具類為TestEntity實(shí)體類的所有字段賦默認(rèn)值,并輸出結(jié)果。需要注意的是,使用該工具類前,必須為實(shí)體類的所有字段添加了getter和setter方法。

public class TestEntity {
    int id;
    String name;
    boolean finished;
    // 構(gòu)造函數(shù)省略
    // 必須添加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;
    }
}
// 測(cè)試
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
    }
}

二、升級(jí)版-多層嵌套

實(shí)體包含多層嵌套的子實(shí)體,可以通過遞歸的方式,為所有子實(shí)體和子實(shí)體的字段賦默認(rèn)值。以下是擴(kuò)展后的工具類代碼

1、工具類

此工具類代碼實(shí)現(xiàn)了為任意實(shí)體類的所有字段以及多層子實(shí)體類的所有字段賦默認(rèn)值的功能。使用方法與上面的示例相同,需要注意的是,使用該工具類前,必須為實(shí)體類的所有字段添加了getter和setter方法。同時(shí),在進(jìn)行遞歸時(shí),需要判斷子實(shí)體類的類型是否具有ClassLoader屬性,以此來判斷其是否是一個(gè)實(shí)體類。如果是實(shí)體類,則使用遞歸方式為子實(shí)體類的字段賦默認(rèn)值。

import java.lang.reflect.Field;
public class EntityDefaultValues {
    /**
     * 為指定實(shí)體類的所有字段以及多層子實(shí)體類的字段賦默認(rèn)值
     * @param entityClass 實(shí)體類的Class對(duì)象
     * @param <T> 實(shí)體類的類型
     * @throws IllegalAccessException 當(dāng)訪問實(shí)體類字段失敗時(shí)拋出
     * @throws InstantiationException 當(dāng)創(chuàng)建實(shí)體類實(shí)例失敗時(shí)拋出
     */
    public static <T> T setDefaultValues(Class<T> entityClass) throws IllegalAccessException, InstantiationException {
        // 使用newInstance方法創(chuàng)建實(shí)體類的實(shí)例
        T entity = entityClass.newInstance();
        // 獲取實(shí)體類的所有字段
        Field[] fields = entityClass.getDeclaredFields();
        // 遍歷所有字段并為其賦默認(rèn)值
        for(Field field : fields){
            field.setAccessible(true);
            // 如果該字段是一個(gè)實(shí)體類
            if(field.getType().getClassLoader() != null){
                // 使用遞歸方式為子實(shí)體類的字段賦默認(rèn)值
                Object subEntity = setDefaultValues(field.getType());
                field.set(entity, subEntity);
            }else{
                Object value = getDefaultFieldValue(field.getType());
                field.set(entity, value);
            }
        }
        return entity;
    }
    /**
     * 獲取指定數(shù)據(jù)類型的默認(rèn)值
     * @param type 數(shù)據(jù)類型的Class對(duì)象
     * @return 數(shù)據(jù)類型的默認(rèn)值
     */
    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; // 引用類型默認(rèn)為null
        }
    }
}

2、實(shí)體類與測(cè)試代碼

使用EntityDefaultValues工具類為TestEntity實(shí)體類及其內(nèi)部SubEntity子實(shí)體類的所有字段賦默認(rèn)值。結(jié)果輸出默認(rèn)的數(shù)值類型、字符類型和布爾類型的默認(rèn)值,日期類型為null,引用類型也為null。

public class TestEntity {
    int id;
    String name;
    boolean finished;
    Date createTime;
    SubEntity subEntity;
    // 構(gòu)造函數(shù)省略
    // 必須添加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;
    // 構(gòu)造函數(shù)省略
    // 必須添加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;
    }
}
// 測(cè)試
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、工具類

工具類代碼實(shí)現(xiàn)了為任意實(shí)體類的所有字段以及多層子實(shí)體類的所有字段、各種類型的集合字段賦默認(rèn)值,需要注意的是,使用該工具類前,必須為實(shí)體類的所有字段添加了getter和setter方法。同時(shí),在進(jìn)行遞歸時(shí),需要判斷子實(shí)體類的類型是否具有ClassLoader屬性,以此來判斷其是否是一個(gè)實(shí)體類。對(duì)于各種類型的集合字段,需要通過判斷集合的具體實(shí)現(xiàn)類來確定其默認(rèn)值及具體實(shí)現(xiàn)類。對(duì)于基本類型和引用類型的字段,可以使用getDefaultFieldValue()方法獲取其默認(rèn)值。

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 {
    /**
     * 為指定實(shí)體類的所有字段以及多層子實(shí)體類的字段、各種集合類型的字段賦默認(rèn)值
     * @param entityClass 實(shí)體類的Class對(duì)象
     * @param <T> 實(shí)體類的類型
     * @throws IllegalAccessException 當(dāng)訪問實(shí)體類字段失敗時(shí)拋出
     * @throws InstantiationException 當(dāng)創(chuàng)建實(shí)體類實(shí)例失敗時(shí)拋出
     */
    public static <T> T setDefaultValues(Class<T> entityClass) throws IllegalAccessException, InstantiationException {
        // 使用newInstance方法創(chuàng)建實(shí)體類的實(shí)例
        T entity = entityClass.newInstance();
        // 獲取實(shí)體類的所有字段
        Field[] fields = entityClass.getDeclaredFields();
        // 遍歷所有字段并為其賦默認(rèn)值
        for(Field field : fields){
            field.setAccessible(true);
            Object value = null;
            Class<?> fieldType = field.getType();
            // 如果該字段是一個(gè)集合類型
            if(Collection.class.isAssignableFrom(fieldType)){
                // 判斷集合類型的具體實(shí)現(xiàn)類
                if(List.class.isAssignableFrom(fieldType)){
                    // 創(chuàng)建一個(gè)空的List對(duì)象
                    value = new ArrayList<>();
                }else if(Map.class.isAssignableFrom(fieldType)){
                    // 創(chuàng)建一個(gè)空的HashMap對(duì)象
                    value = new HashMap<>();
                }else{
                    // 其他類型的集合使用空的Collection對(duì)象
                    value = new ArrayList<>();
                }
                field.set(entity, value);
            }
            // 如果該字段是一個(gè)實(shí)體類
            else if(fieldType.getClassLoader() != null){
                // 使用遞歸方式為子實(shí)體類的字段賦默認(rèn)值
                Object subEntity = setDefaultValues(fieldType);
                field.set(entity, subEntity);
            }
            // 如果該字段是一個(gè)基本類型或引用類型
            else{
                value = getDefaultFieldValue(fieldType);
                field.set(entity, value);
            }
        }
        return entity;
    }
    /**
     * 獲取指定數(shù)據(jù)類型的默認(rèn)值
     * @param type 數(shù)據(jù)類型的Class對(duì)象
     * @return 數(shù)據(jù)類型的默認(rèn)值
     */
    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; // 引用類型默認(rèn)為null
        }
    }
}

2、實(shí)體類與測(cè)試代碼

使用EntityDefaultValues工具類為TestEntity實(shí)體類及其內(nèi)部SubEntity子實(shí)體類的所有字段賦默認(rèn)值。結(jié)果輸出默認(rèn)的數(shù)值類型、字符類型和布爾類型的默認(rèn)值,日期類型為null,引用類型也為null,List和Map類型為默認(rèn)的空集合對(duì)象。需要注意的是,在進(jìn)行遞歸時(shí),需要判斷子實(shí)體類的類型是否具有ClassLoader屬性,以此來判斷其是否是一個(gè)實(shí)體類。如果是實(shí)體類,則使用遞歸方式為子實(shí)體類的字段賦默認(rèn)值。同時(shí),在為L(zhǎng)ist和Map類型的字段賦默認(rèn)值時(shí),需要通過判斷集合的具體實(shí)現(xiàn)類來確定其默認(rèn)值及具體實(shí)現(xiàn)類。

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;
    // 構(gòu)造函數(shù)省略
    // 必須添加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;
    // 構(gòu)造函數(shù)省略
    // 必須添加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;
    }
}
// 測(cè)試
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()); // 輸出 {}
    }
}

總結(jié)

到此這篇關(guān)于Java給實(shí)體每一個(gè)字段賦默認(rèn)值的文章就介紹到這了,更多相關(guān)Java實(shí)體字段賦默認(rèn)值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA導(dǎo)入geoserver項(xiàng)目的詳細(xì)步驟及注意事項(xiàng)

    IDEA導(dǎo)入geoserver項(xiàng)目的詳細(xì)步驟及注意事項(xiàng)

    由于GeoServer是基于Java開發(fā)的。因此在安裝之前,必須確保安裝了Java。本文給大家分享IDEA導(dǎo)入geoserver項(xiàng)目的詳細(xì)步驟及注意事項(xiàng),感興趣的朋友一起看看吧
    2021-06-06
  • Elasticsearch QueryBuilder簡(jiǎn)單查詢實(shí)現(xiàn)解析

    Elasticsearch QueryBuilder簡(jiǎn)單查詢實(shí)現(xiàn)解析

    這篇文章主要介紹了Elasticsearch QueryBuilder簡(jiǎn)單查詢實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 使用注解開發(fā)SpringMVC詳細(xì)配置教程

    使用注解開發(fā)SpringMVC詳細(xì)配置教程

    這篇文章主要介紹了使用注解開發(fā)SpringMVC詳細(xì)配置教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Spring的編程式事務(wù)和聲明式事務(wù)詳解

    Spring的編程式事務(wù)和聲明式事務(wù)詳解

    這篇文章主要介紹了Spring的編程式事務(wù)和聲明式事務(wù)的相關(guān)內(nèi)容,涉及Spring事務(wù)屬性、Spring事務(wù)的基本類等知識(shí),需要的朋友可以了解下。
    2017-09-09
  • 完美解決Eclipse 項(xiàng)目有紅感嘆號(hào)的問題

    完美解決Eclipse 項(xiàng)目有紅感嘆號(hào)的問題

    下面小編就為大家?guī)硪黄昝澜鉀QEclipse 項(xiàng)目有紅感嘆號(hào)的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • springboot無法跳轉(zhuǎn)頁面的問題解決方案

    springboot無法跳轉(zhuǎn)頁面的問題解決方案

    這篇文章主要介紹了springboot無法跳轉(zhuǎn)頁面的問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java編程技巧:if-else優(yōu)化實(shí)踐總結(jié)歸納

    Java編程技巧:if-else優(yōu)化實(shí)踐總結(jié)歸納

    這篇文章主要介紹了Java中避免過多if-else的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2021-06-06
  • SpringSecurity-2.7中跨域問題解析

    SpringSecurity-2.7中跨域問題解析

    這篇文章主要介紹了SpringSecurity-2.7中跨域問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • 使用SpringBoot+AOP實(shí)現(xiàn)可插拔式日志的示例代碼

    使用SpringBoot+AOP實(shí)現(xiàn)可插拔式日志的示例代碼

    這篇文章主要介紹了使用SpringBoot+AOP實(shí)現(xiàn)可插拔式日志的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • springboot源碼中this::selfInitialize怪異用法的含義解析

    springboot源碼中this::selfInitialize怪異用法的含義解析

    這篇文章主要介紹了springboot源碼中this::selfInitialize怪異用法的含義解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03

最新評(píng)論