最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)文章

  • Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解

    Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解

    這篇文章主要介紹了Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解,就是String,StringBuilder以及StringBuffer這三個類之間有什么區(qū)別呢,自己從網(wǎng)上搜索了一些資料,有所了解了之后在這里整理一下,便于大家觀看,需要的朋友可以參考下
    2023-12-12
  • Java Convert Kotlin空指針異常的解決方法

    Java Convert Kotlin空指針異常的解決方法

    本文主要介紹了Java?Convert?Kotlin空指針異常的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 利用JStack排查死鎖問題和CPU100%問題

    利用JStack排查死鎖問題和CPU100%問題

    無論是再面試過程中還是再實際項目開發(fā)當(dāng)中我們都有可能遇到這兩個問題如何利用JStack排查死鎖問題和CPU100%問題,文中給出了詳細的排查過程和解決方法,需要的朋友可以參考下
    2023-12-12
  • java實現(xiàn)分段讀取文件并通過HTTP上傳的方法

    java實現(xiàn)分段讀取文件并通過HTTP上傳的方法

    這篇文章主要介紹了java實現(xiàn)分段讀取文件并通過HTTP上傳的方法,實例分析了java分段讀取文件及使用http實現(xiàn)文件傳輸?shù)南嚓P(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • Java簡單實現(xiàn)猜數(shù)字游戲附C語言版本

    Java簡單實現(xiàn)猜數(shù)字游戲附C語言版本

    猜數(shù)字是興起于英國的益智類小游戲,起源于20世紀中期,一般由兩個人或多人玩,也可以由一個人和電腦玩。游戲規(guī)則為一方出數(shù)字,一方猜,今天我們來用Java和C語言分別把這個小游戲?qū)懗鰜砭毦毷?/div> 2021-11-11
  • 關(guān)于Java數(shù)組查詢的相關(guān)問題及實例

    關(guān)于Java數(shù)組查詢的相關(guān)問題及實例

    這篇文章主要介紹了關(guān)于Java數(shù)組查詢的相關(guān)問題及實例,需要的朋友可以參考下。
    2017-08-08
  • SpringMVC架構(gòu)的項目 js,css等靜態(tài)文件導(dǎo)入有問題的解決方法

    SpringMVC架構(gòu)的項目 js,css等靜態(tài)文件導(dǎo)入有問題的解決方法

    下面小編就為大家?guī)硪黄猄pringMVC架構(gòu)的項目 js,css等靜態(tài)文件導(dǎo)入有問題的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java用鄰接表存儲圖的示例代碼

    Java用鄰接表存儲圖的示例代碼

    鄰接表是圖的一種鏈式存儲方法,其數(shù)據(jù)結(jié)構(gòu)包括兩部分:節(jié)點和鄰接點。本文將用鄰接表實現(xiàn)存儲圖,感興趣的小伙伴可以了解一下
    2022-06-06
  • Spring中常見的7種BeanDefinition詳解

    Spring中常見的7種BeanDefinition詳解

    在?Spring?容器中,我們廣泛使用的是一個一個的?Bean,BeanDefinition?從名字上就可以看出是關(guān)于?Bean?的定義,下面就跟隨小編一起深入了解一下常見的7中BeanDefinition吧
    2023-09-09
  • SpringBoot+Mybatis實現(xiàn)Mapper接口與Sql綁定幾種姿勢

    SpringBoot+Mybatis實現(xiàn)Mapper接口與Sql綁定幾種姿勢

    通常我們在使用Mybatis進行開發(fā)時,會選擇xml文件來寫對應(yīng)的sql,然后將Mapper接口與sql的xml文件建立綁定關(guān)系,然后在項目中調(diào)用mapper接口就可以執(zhí)行對應(yīng)的sql,感興趣的可以學(xué)習(xí)一下
    2021-09-09

最新評論

云浮市| 平遥县| 景东| 彭泽县| 广安市| 芦山县| 潼南县| 宜章县| 桦川县| 邮箱| 突泉县| 墨竹工卡县| 拉萨市| 杭州市| 西城区| 上思县| 吉水县| 承德县| 永仁县| 竹山县| 延庆县| 炎陵县| 西乌珠穆沁旗| 建湖县| 兴义市| 赤峰市| 潞西市| 如皋市| 安乡县| 景宁| 金门县| 芒康县| 宁武县| 南阳市| 建水县| 砚山县| 厦门市| 枣阳市| 加查县| 东乡| 安图县|