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"); // 調用get方法 String invoke = (String) getMethod.invoke(autoClass); System.out.println(invoke); // 通過方法名獲取set方法,由于set方法是有參數(shù)的,所以這里也需要定義set方法的參數(shù)類型 Method setMethod = autoClass.getClass().getMethod("setId", String.class); // 調用set方法 setMethod.invoke(autoClass, "gftz"); System.out.println(autoClass.getId()); // invoke方法中的autoClass表示autoClass這個指定對象調用相應方法
二、通過反射機制實現(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; // 通過屬性類型來獲取相應的方法以及強制轉化屬性值并初始化相應屬性 // 這里考慮到了大部分常用的數(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ù)類對象的屬性內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
聊聊在獲取方法參數(shù)名方面,Spring真的就比Mybatis強?
在獲取方法參數(shù)名方面,Spring真的就比Mybatis強嗎?今天就帶大家聊聊這個話題,如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12MyBatis使用自定義TypeHandler轉換類型的實現(xiàn)方法
這篇文章主要介紹了MyBatis使用自定義TypeHandler轉換類型的實現(xiàn)方法,本文介紹使用TypeHandler 實現(xiàn)日期類型的轉換,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-10-10IDEA “Cannot resolve symbol”爆紅問題解決
最近發(fā)現(xiàn)個問題,IDEA 無法識別同一個 package 里的其他類,將其顯示為紅色,本文就來介紹一下IDEA “Cannot resolve symbol”爆紅問題解決,感興趣的可以了解一下2023-10-10SpringBoot中的@RestControllerAdvice注解詳解
這篇文章主要介紹了SpringBoot中的@RestControllerAdvice注解詳解,RestControllerAdvice注解用于創(chuàng)建全局異常處理類,用于捕獲和處理整個應用程序中的異常,需要的朋友可以參考下2024-01-01使用Java實現(xiàn)一個不同難度(高、中、低)的猜數(shù)字游戲
本文介紹了一個增強版的猜數(shù)字游戲,包括菜單打印、游戲維持、邏輯功能選擇和源代碼展示,游戲通過隨機數(shù)生成和邏輯判斷來維持游戲進程,用戶可以選擇不同的難度,源代碼展示了如何實現(xiàn)這三種不同難度的猜數(shù)字游戲,為玩家?guī)砀嗵魬?zhàn)和樂趣,需要的朋友可以參考下2024-09-09在Java中輕松將HTML格式文本轉換為純文本的方法示例(保留換行)
這篇文章主要介紹了在Java中輕松將HTML格式文本轉換為純文本的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04