Java如何通過反射獲取對象的屬性和值
Java反射獲取對象的屬性和值
最近有一個功能,需要判斷傳過來的對象的屬性值是否為空,并附帶其他一些判斷操作。
一開始想著直接obj.getXXX()
取出來再挨個判斷,后來覺得寫了太多重復(fù)代碼了,于是想著用Java反射試一試。
現(xiàn)在在這里記錄一下, 換了一個例子,獲取Person
對象的屬性名和屬性值。
代碼:
Person對象:
public class Person { private String firstName; private String lastName; public Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } }
獲取屬性和值的方法:
public static void main(String[] args) { Person p1 = new Person("xiao ming", "huang"); getField(p1); } public static void getField(Object obj) { Class<?> clazz = obj.getClass(); Field[] field = clazz.getDeclaredFields(); for (Field f : field) { f.setAccessible(true); try { System.out.println("屬性名:" + f.getName()+",屬性值:" + f.get(obj).toString()); // ... } catch (IllegalAccessException e) { e.printStackTrace(); } } }
結(jié)果:
屬性名:firstName,屬性值:xiao ming
屬性名:lastName,屬性值:huang
Java反射的三種方式,獲取 屬性、方法、構(gòu)造方法 簡單明了
反射的步驟如下:
1.獲取想要操作的類的Class對象,該Class對象才是類的核心,通過它可以調(diào)用類的任意方法。
2.調(diào)用Class對象所對應(yīng)的類中定義的方法,這是反射的使用階段。
3.使用反射API來獲取并調(diào)用類的屬性和方法等信息
java的反射有三種方式實現(xiàn)
1.調(diào)用某個對象的getClass方法以獲取該類的Class對象:
Person p = new Person(); Class clazz = p.getClass();
2.調(diào)用某個類的Class屬性以獲取該類對應(yīng)的Class對象:
Class clazz = Person.class;
3.調(diào)用Class類中的forName靜態(tài)方法獲取該類對象,這是最安全也是性能最好的方法:
Class clazz = Class.forNmae("com.user.entery.Person")//類的全路徑包括包名
獲取類的內(nèi)容
1.獲取全部方法
```Class three = Class.forName("com.nasi.demo.entity.User"); //獲取全部方法 Method[] declaredMethods = three.getDeclaredMethods();
2.獲取全部構(gòu)造方法
Class three = Class.forName("com.nasi.demo.entity.User"); //獲取全部構(gòu)造方法 Constructor[] declaredConstructors = three.getDeclaredConstructors();
3.獲取全部屬性
Class three = Class.forName("com.nasi.demo.entity.User"); Field[] declaredFields = two.getDeclaredFields();
方法調(diào)用
1、編寫一個 Java 類
public class Calculator{ public double add(double score1,double score2){ return score1 + score2; } public void print(){ System.out.println("OK"); } public static double mul(double score1,double score2){ return score1 * score2; } }
2、通過 反射 調(diào)用類里面的方法
public class CalculatorTest { public static void main(String[] args) throws Exception { //通過類的.class屬性獲取 Class<Calculator> clz = Calculator.class; //或者通過類的完整路徑獲取,這個方法由于不能確定傳入的路徑是否正確,這個方法會拋ClassNotFoundException // Class<Calculator> clz = Class.forName("test.Calculator"); //或者new一個實例,然后通過實例的getClass()方法獲取 // Calculator s = new Calculator(); // Class<Calculator> clz = s.getClass(); //1. 獲取類中帶有方法簽名的mul方法,getMethod第一個參數(shù)為方法名,第二個參數(shù)為mul的參數(shù)類型數(shù)組 Method method = clz.getMethod("mul", new Class[]{double.class,double.class}); //invoke 方法的第一個參數(shù)是被調(diào)用的對象,這里是靜態(tài)方法故為null,第二個參數(shù)為給將被調(diào)用的方法傳入的參數(shù) Object result = method.invoke(null, new Object[]{2.0,2.5}); //如果方法mul是私有的private方法,按照上面的方法去調(diào)用則會產(chǎn)生異常NoSuchMethodException,這時必須改變其訪問屬性 //method.setAccessible(true);//私有的方法通過發(fā)射可以修改其訪問權(quán)限 System.out.println(result);//結(jié)果為5.0 //2. 獲取類中的非靜態(tài)方法 Method method_2 = clz.getMethod("add", new Class[]{double.class,double.class}); //這是實例方法必須在一個對象上執(zhí)行 Object result_2 = method_2.invoke(new Calculator(), new Object[]{2.0,2.5}); System.out.println(result_2);//4.5 //3. 獲取沒有方法簽名的方法print Method method_3 = clz.getMethod("print", new Class[]{}); Object result_3 = method_3.invoke(new Calculator(), null);//result_3為null,該方法不返回結(jié)果 } }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springcloud如何使用Feign后臺內(nèi)部傳遞MultipartFile
這篇文章主要介紹了springcloud如何使用Feign后臺內(nèi)部傳遞MultipartFile,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03Java中數(shù)組和String相互轉(zhuǎn)換的幾種常見方法
這篇文章主要介紹了Java中數(shù)組和String相互轉(zhuǎn)換的幾種常見方法,每種類型都有相應(yīng)的轉(zhuǎn)換方法,如使用String類的構(gòu)造函數(shù)、toCharArray()、String.join()、Arrays.toString()、StringBuilder等,這些方法能幫助開發(fā)者高效地進(jìn)行數(shù)據(jù)類型之間的轉(zhuǎn)換,需要的朋友可以參考下2025-04-04Kotlin基礎(chǔ)教程之dataclass,objectclass,use函數(shù),類擴(kuò)展,socket
這篇文章主要介紹了Kotlin基礎(chǔ)教程之dataclass,objectclass,use函數(shù),類擴(kuò)展,socket的相關(guān)資料,需要的朋友可以參考下2017-05-05引入mybatis-plus報 Invalid bound statement錯誤問題的解決方法
這篇文章主要介紹了引入mybatis-plus報 Invalid bound statement錯誤問題的解決方法,需要的朋友可以參考下2020-05-05