java反射機(jī)制給實(shí)體類相同字段自動(dòng)賦值實(shí)例
一、封裝一個(gè)工具類
1、簡(jiǎn)易版
package net.aexit.construct.acceptance.websky.utils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class ClassReflection {
/**
* @param class1 用于賦值的實(shí)體類
* @param class2 需要待賦值的實(shí)體類
* 描述:反射實(shí)體類賦值
*/
public static void reflectionAttr(Object class1,Object class2) throws Exception{
Class clazz1 = class1.getClass();
Class clazz2 = class2.getClass();
// 獲取兩個(gè)實(shí)體類的所有屬性
Field[] fields1 = clazz1.getDeclaredFields();
Field[] fields2 = clazz2.getDeclaredFields();
// 遍歷class1Bean,獲取逐個(gè)屬性值,然后遍歷class2Bean查找是否有相同的屬性,如有相同則賦值
for (Field f1 : fields1) {
if(f1.getName().equals("id"))
continue;
//設(shè)置訪問(wèn)權(quán)限
f1.setAccessible(true);
Object value = f1.get(class1);
for (Field f2 : fields2) {
if(f1.getName().equals(f2.getName())){
//設(shè)置訪問(wèn)權(quán)限
f2.setAccessible(true);
f2.set(class2,value);
}
}
}
}
}
2、復(fù)雜版
package net.utils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class ClassReflection {
/**
* @param class1 用于賦值的實(shí)體類
* @param class2 需要待賦值的實(shí)體類
* 描述:反射實(shí)體類賦值
*/
public static void reflectionAttr(Object class1,Object class2) throws Exception{
Class clazz1 = Class.forName(class1.getClass().getName());
Class clazz2 = Class.forName(class2.getClass().getName());
// 獲取兩個(gè)實(shí)體類的所有屬性
Field[] fields1 = clazz1.getDeclaredFields();
Field[] fields2 = clazz2.getDeclaredFields();
ClassReflection cr = new ClassReflection();
// 遍歷class1Bean,獲取逐個(gè)屬性值,然后遍歷class2Bean查找是否有相同的屬性,如有相同則賦值
for (Field f1 : fields1) {
if(f1.getName().equals("id"))
continue;
Object value = cr.invokeGetMethod(class1 ,f1.getName(),null);
for (Field f2 : fields2) {
if(f1.getName().equals(f2.getName())){
Object[] obj = new Object[1];
obj[0] = value;
cr.invokeSetMethod(class2, f2.getName(), obj);
}
}
}
}
/**
*
* 執(zhí)行某個(gè)Field的getField方法
* @param clazz 類
* @param fieldName 類的屬性名稱
* @param args 參數(shù),默認(rèn)為null
* @return
*/
public Object invokeGetMethod(Object clazz, String fieldName, Object[] args) {
String methodName = fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);
Method method = null;
try
{
method = Class.forName(clazz.getClass().getName()).getDeclaredMethod("get" + methodName);
return method.invoke(clazz);
}
catch (Exception e)
{
e.printStackTrace();
return "";
}
}
/**
*
* 執(zhí)行某個(gè)Field的setField方法
* @param clazz 類
* @param fieldName 類的屬性名稱
* @param args 參數(shù),默認(rèn)為null
* @return
*/
public Object invokeSetMethod(Object clazz, String fieldName, Object[] args)
{
String methodName = fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);
Method method = null;
try
{
Class[] parameterTypes = new Class[1];
Class c = Class.forName(clazz.getClass().getName());
Field field = c.getDeclaredField(fieldName);
parameterTypes[0] = field.getType();
method = c.getDeclaredMethod("set" + methodName,parameterTypes);
return method.invoke(clazz,args);
}
catch (Exception e)
{
e.printStackTrace();
return "";
}
}
//map轉(zhuǎn)換為json字符串
public static String hashMapToJson(HashMap map) {
String string = "{";
for (Iterator it = map.entrySet().iterator(); it.hasNext();) {
Map.Entry e = (Map.Entry) it.next();
string += "'" + e.getKey() + "':";
string += "'" + e.getValue() + "',";
}
string = string.substring(0, string.lastIndexOf(","));
string += "}";
return string;
}
}
二、調(diào)用工具類
ClassReflection.reflectionAttr(class1, class2);
三、賦值完成
注意:
1、id不賦值,主要給數(shù)據(jù)庫(kù)兩張表賦值,比如當(dāng)前表和歷史表,把當(dāng)前表的相同字段的值賦值給歷史表
2、簡(jiǎn)單版設(shè)置private修飾的字段可以被訪問(wèn)
補(bǔ)充知識(shí):利用java反射原理給實(shí)體類注值
寫一個(gè)通用java注值的方法,使用泛型T,將其封裝在DbHelp中(相信DbHelper不用我解釋是什么),使dao調(diào)用直接獲取所需要的對(duì)象,也正應(yīng)用了我們java面向?qū)ο蟮乃枷?/p>
public static<T> T getBean(String sql,Class<T> clazz){
Method[] ms=clazz.getDeclaredMethods();
T t=null;
try {
t=clazz.newInstance();
for (Method m : ms) {
String mn=m.getName();
if(mn.startsWith("set")){
Object obj=map.get((mn.replace("set", "").toUpperCase()));//取到set方法對(duì)應(yīng)數(shù)據(jù)庫(kù)字段的值
String pt=m.getParameterTypes()[0].toString();//取到set方法的參數(shù)類型
if(obj!=null){
if(pt.endsWith("int")||pt.endsWith("Integer")){
m.invoke(t, ((BigDecimal)obj).intValue());
}else if(pt.endsWith("Double")||pt.endsWith("double")){
m.invoke(t, ((BigDecimal)obj).doubleValue());
}else if(pt.endsWith("Date")){
m.invoke(t, (Timestamp)obj);
}else {
m.invoke(t, obj);
}
}
}
}
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return t;
}
以上這篇java反射機(jī)制給實(shí)體類相同字段自動(dòng)賦值實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Java如何通過(guò)反射方式生成數(shù)據(jù)庫(kù)實(shí)體類
- Java反射機(jī)制,如何將一個(gè)實(shí)體類所有字段賦值為null
- java 實(shí)現(xiàn)反射 json動(dòng)態(tài)轉(zhuǎn)實(shí)體類--fastjson
- 利用JAVA反射,讀取數(shù)據(jù)庫(kù)表名,自動(dòng)生成對(duì)應(yīng)實(shí)體類的操作
- Java 通過(guò)反射給實(shí)體類賦值操作
- java反射遍歷實(shí)體類屬性和類型,并賦值和獲取值的簡(jiǎn)單方法
- Java如何通過(guò)反射取實(shí)體類字段取值
相關(guān)文章
使用SpringBoot進(jìn)行身份驗(yàn)證和授權(quán)的示例詳解
在廣闊的 Web 開(kāi)發(fā)世界中,身份驗(yàn)證是每個(gè)數(shù)字領(lǐng)域的守護(hù)者,在本教程中,我們將了解如何以本機(jī)方式保護(hù)、驗(yàn)證和授權(quán) Spring-Boot 應(yīng)用程序的用戶,并遵循框架的良好實(shí)踐,希望對(duì)大家有所幫助2023-11-11
使用jekins自動(dòng)構(gòu)建部署java maven項(xiàng)目的方法步驟
這篇文章主要介紹了使用jekins自動(dòng)構(gòu)建部署java maven項(xiàng)目的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Spring Boot Actuator端點(diǎn)相關(guān)原理解析
這篇文章主要介紹了Spring Boot Actuator端點(diǎn)相關(guān)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Spring Cloud OAuth2中/oauth/token的返回內(nèi)容格式
Spring Cloud OAuth2 生成access token的請(qǐng)求/oauth/token的返回內(nèi)容就需要自定義,本文就詳細(xì)介紹一下,感興趣的可以了解一下2021-07-07
Java動(dòng)態(tài)初始化數(shù)組,元素默認(rèn)值規(guī)則詳解
動(dòng)態(tài)初始化數(shù)組涉及先定義數(shù)組長(zhǎng)度,后填充具體數(shù)據(jù),適用于數(shù)據(jù)量已知但具體值未定的情況,這種初始化方式允許程序運(yùn)行過(guò)程中賦值,并會(huì)根據(jù)數(shù)據(jù)類型設(shè)定默認(rèn)值,如整型為0,字符串為null,動(dòng)態(tài)初始化與靜態(tài)初始化格式不能混用2024-10-10
5分鐘教你使用java搞定網(wǎng)站登錄驗(yàn)證碼
這篇文章主要為大家介紹了使用java搞定網(wǎng)站登錄驗(yàn)證碼的快速實(shí)現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04

