Java如何通過反射機(jī)制獲取數(shù)據(jù)類對(duì)象的屬性及方法
一、通過反射機(jī)制獲取類對(duì)象的所有屬性以及相應(yīng)的get、set方法
1.遍歷類對(duì)象的所有屬性
//可以使用getDeclaredFields()方法獲取對(duì)象的所有屬性 AutoClass autoClass = new AutoClass(); // 先初始化一個(gè)類 Field[] fields = autoClass.getClass().getDeclaredFields(); // 獲取對(duì)象的所有屬性 for (Field item : fields) { String name = item.getName(); // 獲取對(duì)象屬性名 String typeName = item.getGenericType().getTypeName(); // 獲取對(duì)象屬性的類型 System.out.printf("屬性名:%s,類型:%s\n", name, typeName); }
2.獲取屬性的get、set方法
// 一般而言每個(gè)屬性都有其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這個(gè)指定對(duì)象調(diào)用相應(yīng)方法
二、通過反射機(jī)制實(shí)現(xiàn)類對(duì)象的實(shí)例化
1.工具類
package utils; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.math.BigDecimal; import java.util.Date; /** * @description: 數(shù)據(jù)類的相關(guān)操作 * @author: 黃珺瑜 * @create: 2022-07-07 22:05 **/ // 由于為了讓這個(gè)工具類能夠通用,故而用了泛型,對(duì)其不了解需要自行百度一下。 public class ObjectOperate<T> { /** * 設(shè)置數(shù)據(jù)類對(duì)象的屬性 * @param obj 數(shù)據(jù)類對(duì)象的實(shí)例 * @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; // 通過屬性類型來獲取相應(yīng)的方法以及強(qiáng)制轉(zhuǎn)化屬性值并初始化相應(yīng)屬性 // 這里考慮到了大部分常用的數(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(); // 屬性名 // 設(shè)置為屬性的set方法名,如:屬性名為id,對(duì)應(yīng)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)); // 初始化對(duì)象的屬性 } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } System.out.println(autoClass.toString());
到此這篇關(guān)于Java如何通過反射機(jī)制獲取數(shù)據(jù)類對(duì)象的屬性及方法的文章就介紹到這了,更多相關(guān)java反射獲取數(shù)據(jù)類對(duì)象的屬性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
聊聊在獲取方法參數(shù)名方面,Spring真的就比Mybatis強(qiáng)?
在獲取方法參數(shù)名方面,Spring真的就比Mybatis強(qiáng)嗎?今天就帶大家聊聊這個(gè)話題,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12并發(fā)編程之Java內(nèi)存模型鎖的內(nèi)存語義
這篇文章主要介紹了并發(fā)編程之Java內(nèi)存模型鎖的內(nèi)存語義,鎖的作用是讓臨界區(qū)互斥執(zhí)行,本文只要圍繞鎖的內(nèi)存語義展開全文內(nèi)容,需要的小伙伴可以參考一下2021-11-11MyBatis使用自定義TypeHandler轉(zhuǎn)換類型的實(shí)現(xiàn)方法
這篇文章主要介紹了MyBatis使用自定義TypeHandler轉(zhuǎn)換類型的實(shí)現(xiàn)方法,本文介紹使用TypeHandler 實(shí)現(xiàn)日期類型的轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10Java中動(dòng)態(tài)設(shè)置JVM參數(shù)的方法總結(jié)
通過動(dòng)態(tài)設(shè)置JVM參數(shù),開發(fā)者可以更有效地管理資源使用和優(yōu)化性能,本文將詳細(xì)闡述如何在Java中動(dòng)態(tài)設(shè)置JVM參數(shù),感興趣的小伙伴可以了解下2024-12-12IDEA “Cannot resolve symbol”爆紅問題解決
最近發(fā)現(xiàn)個(gè)問題,IDEA 無法識(shí)別同一個(gè) package 里的其他類,將其顯示為紅色,本文就來介紹一下IDEA “Cannot resolve symbol”爆紅問題解決,感興趣的可以了解一下2023-10-10詳解 Java HashMap 實(shí)現(xiàn)原理
這篇文章主要介紹了詳解 Java HashMap 實(shí)現(xiàn)原理的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03SpringBoot中的@RestControllerAdvice注解詳解
這篇文章主要介紹了SpringBoot中的@RestControllerAdvice注解詳解,RestControllerAdvice注解用于創(chuàng)建全局異常處理類,用于捕獲和處理整個(gè)應(yīng)用程序中的異常,需要的朋友可以參考下2024-01-01使用Java實(shí)現(xiàn)一個(gè)不同難度(高、中、低)的猜數(shù)字游戲
本文介紹了一個(gè)增強(qiáng)版的猜數(shù)字游戲,包括菜單打印、游戲維持、邏輯功能選擇和源代碼展示,游戲通過隨機(jī)數(shù)生成和邏輯判斷來維持游戲進(jìn)程,用戶可以選擇不同的難度,源代碼展示了如何實(shí)現(xiàn)這三種不同難度的猜數(shù)字游戲,為玩家?guī)砀嗵魬?zhàn)和樂趣,需要的朋友可以參考下2024-09-09在Java中輕松將HTML格式文本轉(zhuǎn)換為純文本的方法示例(保留換行)
這篇文章主要介紹了在Java中輕松將HTML格式文本轉(zhuǎn)換為純文本的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04