Java如何通過反射獲取對象的屬性和值
Java反射獲取對象的屬性和值
最近有一個(gè)功能,需要判斷傳過來的對象的屬性值是否為空,并附帶其他一些判斷操作。
一開始想著直接obj.getXXX()取出來再挨個(gè)判斷,后來覺得寫了太多重復(fù)代碼了,于是想著用Java反射試一試。
現(xiàn)在在這里記錄一下, 換了一個(gè)例子,獲取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的反射有三種方式實(shí)現(xiàn)
1.調(diào)用某個(gè)對象的getClass方法以獲取該類的Class對象:
Person p = new Person(); Class clazz = p.getClass();
2.調(diào)用某個(gè)類的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、編寫一個(gè) 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;
//或者通過類的完整路徑獲取,這個(gè)方法由于不能確定傳入的路徑是否正確,這個(gè)方法會(huì)拋ClassNotFoundException
// Class<Calculator> clz = Class.forName("test.Calculator");
//或者new一個(gè)實(shí)例,然后通過實(shí)例的getClass()方法獲取
// Calculator s = new Calculator();
// Class<Calculator> clz = s.getClass();
//1. 獲取類中帶有方法簽名的mul方法,getMethod第一個(gè)參數(shù)為方法名,第二個(gè)參數(shù)為mul的參數(shù)類型數(shù)組
Method method = clz.getMethod("mul", new Class[]{double.class,double.class});
//invoke 方法的第一個(gè)參數(shù)是被調(diào)用的對象,這里是靜態(tài)方法故為null,第二個(gè)參數(shù)為給將被調(diào)用的方法傳入的參數(shù)
Object result = method.invoke(null, new Object[]{2.0,2.5});
//如果方法mul是私有的private方法,按照上面的方法去調(diào)用則會(huì)產(chǎn)生異常NoSuchMethodException,這時(shí)必須改變其訪問屬性
//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});
//這是實(shí)例方法必須在一個(gè)對象上執(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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springcloud如何使用Feign后臺內(nèi)部傳遞MultipartFile
這篇文章主要介紹了springcloud如何使用Feign后臺內(nèi)部傳遞MultipartFile,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java中數(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-04
Kotlin基礎(chǔ)教程之dataclass,objectclass,use函數(shù),類擴(kuò)展,socket
這篇文章主要介紹了Kotlin基礎(chǔ)教程之dataclass,objectclass,use函數(shù),類擴(kuò)展,socket的相關(guān)資料,需要的朋友可以參考下2017-05-05
使用eclipse創(chuàng)建java項(xiàng)目的方法
這篇文章主要為大家詳細(xì)介紹了使用eclipse創(chuàng)建java項(xiàng)目的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
引入mybatis-plus報(bào) Invalid bound statement錯(cuò)誤問題的解決方法
這篇文章主要介紹了引入mybatis-plus報(bào) Invalid bound statement錯(cuò)誤問題的解決方法,需要的朋友可以參考下2020-05-05

