Java給實(shí)體每一個(gè)字段賦默認(rèn)值詳細(xì)代碼示例
一、初級(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)
由于GeoServer是基于Java開發(fā)的。因此在安裝之前,必須確保安裝了Java。本文給大家分享IDEA導(dǎo)入geoserver項(xiàng)目的詳細(xì)步驟及注意事項(xiàng),感興趣的朋友一起看看吧2021-06-06Elasticsearch QueryBuilder簡(jiǎn)單查詢實(shí)現(xiàn)解析
這篇文章主要介紹了Elasticsearch QueryBuilder簡(jiǎn)單查詢實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08完美解決Eclipse 項(xiàng)目有紅感嘆號(hào)的問題
下面小編就為大家?guī)硪黄昝澜鉀QEclipse 項(xiàng)目有紅感嘆號(hào)的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01springboot無法跳轉(zhuǎn)頁面的問題解決方案
這篇文章主要介紹了springboot無法跳轉(zhuǎn)頁面的問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Java編程技巧:if-else優(yōu)化實(shí)踐總結(jié)歸納
這篇文章主要介紹了Java中避免過多if-else的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2021-06-06使用SpringBoot+AOP實(shí)現(xiàn)可插拔式日志的示例代碼
這篇文章主要介紹了使用SpringBoot+AOP實(shí)現(xiàn)可插拔式日志的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07springboot源碼中this::selfInitialize怪異用法的含義解析
這篇文章主要介紹了springboot源碼中this::selfInitialize怪異用法的含義解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03