Java如何通過反射機制獲取數(shù)據(jù)類對象的屬性及方法
更新時間:2025年01月19日 15:21:23 作者:奕澎
文章介紹了如何使用Java反射機制獲取類對象的所有屬性及其對應的get、set方法,以及如何通過反射機制實現(xiàn)類對象的實例化,感興趣的朋友跟隨小編一起看看吧
一、通過反射機制獲取類對象的所有屬性以及相應的get、set方法
1.遍歷類對象的所有屬性
//可以使用getDeclaredFields()方法獲取對象的所有屬性
AutoClass autoClass = new AutoClass(); // 先初始化一個類
Field[] fields = autoClass.getClass().getDeclaredFields(); // 獲取對象的所有屬性
for (Field item : fields) {
String name = item.getName(); // 獲取對象屬性名
String typeName = item.getGenericType().getTypeName(); // 獲取對象屬性的類型
System.out.printf("屬性名:%s,類型:%s\n", name, typeName);
}2.獲取屬性的get、set方法
// 一般而言每個屬性都有其get和set方法
// 通過方法名獲取get方法
Method getMethod = autoClass.getClass().getMethod("getId");
// 調(diào)用get方法
String invoke = (String) getMethod.invoke(autoClass);
System.out.println(invoke);
// 通過方法名獲取set方法,由于set方法是有參數(shù)的,所以這里也需要定義set方法的參數(shù)類型
Method setMethod = autoClass.getClass().getMethod("setId", String.class);
// 調(diào)用set方法
setMethod.invoke(autoClass, "gftz");
System.out.println(autoClass.getId());
// invoke方法中的autoClass表示autoClass這個指定對象調(diào)用相應方法二、通過反射機制實現(xiàn)類對象的實例化
1.工具類
package utils;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.Date;
/**
* @description: 數(shù)據(jù)類的相關操作
* @author: 黃珺瑜
* @create: 2022-07-07 22:05
**/
// 由于為了讓這個工具類能夠通用,故而用了泛型,對其不了解需要自行百度一下。
public class ObjectOperate<T> {
/**
* 設置數(shù)據(jù)類對象的屬性
* @param obj 數(shù)據(jù)類對象的實例
* @param name 屬性名
* @param type 屬性類型名
* @param val 需要存入的屬性值
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
*/
public void setValues(T obj, String name, String type, Object val) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Method method = null;
// 通過屬性類型來獲取相應的方法以及強制轉(zhuǎn)化屬性值并初始化相應屬性
// 這里考慮到了大部分常用的數(shù)據(jù)類型,可拿來即用。
switch (type){
case "int":
method = obj.getClass().getMethod(name, int.class);
method.invoke(obj,(int)val);
break;
case "short":
method = obj.getClass().getMethod(name, short.class);
method.invoke(obj,(short)val);
break;
case "long":
method = obj.getClass().getMethod(name, long.class);
method.invoke(obj,(long)val);
break;
case "float":
method = obj.getClass().getMethod(name, float.class);
method.invoke(obj,(float)val);
break;
case "double":
method = obj.getClass().getMethod(name, double.class);
method.invoke(obj,(double)val);
break;
case "boolean":
method = obj.getClass().getMethod(name, boolean.class);
method.invoke(obj,(boolean)val);
break;
case "java.lang.String":
method = obj.getClass().getMethod(name, String.class);
method.invoke(obj,(String)val);
break;
case "java.util.Date":
method = obj.getClass().getMethod(name, Date.class);
method.invoke(obj,(Date)val);
break;
case "java.math.BigDecimal":
method = obj.getClass().getMethod(name, BigDecimal.class);
method.invoke(obj,(BigDecimal)val);
break;
}
}
}2、使用案例
// 模擬案例數(shù)據(jù)
List<Object> params = new ArrayList<>();
params.add(UUID.randomUUID().toString().replaceAll("-", ""));
params.add(18);
params.add(new Date());
params.add(false);
params.add(new BigDecimal(888888.8));
// 初始話類型操作的工具類
ObjectOperate<AutoClass> objectOperate = new ObjectOperate<>();
// AutoClass使用到上面的,故不再給出AutoClass類
AutoClass autoClass = new AutoClass();
Field[] fields = autoClass.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
String name = fields[i].getName(); // 屬性名
// 設置為屬性的set方法名,如:屬性名為id,對應set方法名為setId
name = "set"+name.substring(0, 1).toUpperCase() + name.substring(1);
String typeName = fields[i].getGenericType().getTypeName(); //屬性類型名
try {
objectOperate.setValues(autoClass,name,typeName,params.get(i)); // 初始化對象的屬性
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
System.out.println(autoClass.toString());到此這篇關于Java如何通過反射機制獲取數(shù)據(jù)類對象的屬性及方法的文章就介紹到這了,更多相關java反射獲取數(shù)據(jù)類對象的屬性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
從零開始Java實現(xiàn)Parser?Combinator
這篇文章主要為大家介紹了從零開始Java實現(xiàn)Parser?Combinator過程及原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
Windows10系統(tǒng)下修改jar中的文件并重新打包成jar文件然后運行的操作步驟
這篇文章主要介紹了Windows10系統(tǒng)下修改jar中的文件并重新打包成jar文件然后運行的操作步驟,文中通過圖文結合的形式給大家講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-08-08
IDEA運行Java項目報錯java: 錯誤: 不支持發(fā)行版本 xx的解決方法
這篇文章主要介紹了IDEA運行Java項目報錯java: 錯誤: 不支持發(fā)行版本 xx的解決方法,文中有詳細的解決方案供大家參考,對大家解決問題有一定的幫助,需要的朋友可以參考下2025-04-04
Spring Boot 接口參數(shù)加密解密的實現(xiàn)方法
這篇文章主要介紹了Spring Boot 接口參數(shù)加密解密的實現(xiàn)方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
Java并發(fā)統(tǒng)計變量值偏差原因及解決方案
這篇文章主要介紹了Java并發(fā)統(tǒng)計變量值偏差原因及解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06

