Java給實(shí)體每一個(gè)字段賦默認(rèn)值詳細(xì)代碼示例
一、初級版
1、工具類
使用反射機(jī)制實(shí)現(xiàn)任意實(shí)體類字段的默認(rèn)值賦值功能
import java.lang.reflect.Field;
public class EntityDefaultValues {
/**
* 為指定實(shí)體類的所有字段賦默認(rèn)值
* @param entityClass 實(shí)體類的Class對象
* @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對象
* @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í)體類與測試代碼
使用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;
}
}
// 測試
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
}
}二、升級版-多層嵌套
實(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對象
* @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對象
* @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í)體類與測試代碼
使用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;
}
}
// 測試
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í)體類。對于各種類型的集合字段,需要通過判斷集合的具體實(shí)現(xiàn)類來確定其默認(rèn)值及具體實(shí)現(xiàn)類。對于基本類型和引用類型的字段,可以使用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對象
* @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對象
value = new ArrayList<>();
}else if(Map.class.isAssignableFrom(fieldType)){
// 創(chuàng)建一個(gè)空的HashMap對象
value = new HashMap<>();
}else{
// 其他類型的集合使用空的Collection對象
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對象
* @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í)體類與測試代碼
使用EntityDefaultValues工具類為TestEntity實(shí)體類及其內(nèi)部SubEntity子實(shí)體類的所有字段賦默認(rèn)值。結(jié)果輸出默認(rèn)的數(shù)值類型、字符類型和布爾類型的默認(rèn)值,日期類型為null,引用類型也為null,List和Map類型為默認(rèn)的空集合對象。需要注意的是,在進(jìn)行遞歸時(shí),需要判斷子實(shí)體類的類型是否具有ClassLoader屬性,以此來判斷其是否是一個(gè)實(shí)體類。如果是實(shí)體類,則使用遞歸方式為子實(shí)體類的字段賦默認(rèn)值。同時(shí),在為List和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;
}
}
// 測試
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)容請搜索腳本之家以前的文章或繼續(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-06
Elasticsearch QueryBuilder簡單查詢實(shí)現(xiàn)解析
這篇文章主要介紹了Elasticsearch QueryBuilder簡單查詢實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
springboot無法跳轉(zhuǎn)頁面的問題解決方案
這篇文章主要介紹了springboot無法跳轉(zhuǎn)頁面的問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Java編程技巧:if-else優(yōu)化實(shí)踐總結(jié)歸納
這篇文章主要介紹了Java中避免過多if-else的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2021-06-06
使用SpringBoot+AOP實(shí)現(xiàn)可插拔式日志的示例代碼
這篇文章主要介紹了使用SpringBoot+AOP實(shí)現(xiàn)可插拔式日志的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
springboot源碼中this::selfInitialize怪異用法的含義解析
這篇文章主要介紹了springboot源碼中this::selfInitialize怪異用法的含義解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03

