亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java如何通過反射獲取對象的屬性和值

 更新時間:2024年02月28日 16:32:26   作者:可樂還是甜的好  
這篇文章主要介紹了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

    這篇文章主要介紹了springcloud如何使用Feign后臺內(nèi)部傳遞MultipartFile,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java如何消除太多的if else判斷示例代碼

    java如何消除太多的if else判斷示例代碼

    這篇文章主要介紹了java如何消除太多的if else判斷,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • Java隨機(jī)字符串與簡單加密工具類詳解

    Java隨機(jī)字符串與簡單加密工具類詳解

    這篇文章主要介紹了Java隨機(jī)字符串與簡單加密工具類,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java中數(shù)組和String相互轉(zhuǎn)換的幾種常見方法

    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

    這篇文章主要介紹了Kotlin基礎(chǔ)教程之dataclass,objectclass,use函數(shù),類擴(kuò)展,socket的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • java顯示目錄文件列表和刪除目錄功能

    java顯示目錄文件列表和刪除目錄功能

    這篇文章主要介紹了java顯示目錄文件列表和刪除目錄功能,文章通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2017-12-12
  • 使用eclipse創(chuàng)建java項目的方法

    使用eclipse創(chuàng)建java項目的方法

    這篇文章主要為大家詳細(xì)介紹了使用eclipse創(chuàng)建java項目的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Java實現(xiàn)二分搜索樹的示例代碼

    Java實現(xiàn)二分搜索樹的示例代碼

    二分搜索樹是一顆二叉樹,二分搜索樹每個節(jié)點(diǎn)的左子樹的值都小于該節(jié)點(diǎn)的值,每個節(jié)點(diǎn)右子樹的值都大于該節(jié)點(diǎn)的值。本文將利用Java實現(xiàn)二分搜索樹,需要的可以參考一下
    2022-03-03
  • 引入mybatis-plus報 Invalid bound statement錯誤問題的解決方法

    引入mybatis-plus報 Invalid bound statement錯誤問題的解決方法

    這篇文章主要介紹了引入mybatis-plus報 Invalid bound statement錯誤問題的解決方法,需要的朋友可以參考下
    2020-05-05
  • 不看后悔!揭秘游戲服務(wù)器開發(fā)

    不看后悔!揭秘游戲服務(wù)器開發(fā)

    剛開始時以為做游戲服務(wù)器和做web差不多,但是經(jīng)過一段時間之后,才發(fā)現(xiàn)代碼太多,太亂了,這里我把一些游戲開發(fā)方面的東西整理一下,希望能對那些想做游戲服務(wù)器開發(fā)的朋友有所幫助
    2021-06-06

最新評論