欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java的反射機(jī)制一起來看看

 更新時(shí)間:2022年03月14日 14:50:59   作者:aigo-2021  
這篇文章主要為大家詳細(xì)介紹了Java反射機(jī)制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

一、什么是反射機(jī)制?

反射就是運(yùn)行時(shí)識別類的能力,在運(yùn)行時(shí)可以獲得當(dāng)前對象的類結(jié)構(gòu),動態(tài)創(chuàng)建類的實(shí)例,調(diào)用對象的方法等;

獲得Class類對象的三種方式:

方式一 :Class.forName(“類名”);

Class類的一個(gè)靜態(tài)方法forName 加載類獲得類對象 運(yùn)行的類庫中沒有Person類,程序依然可以編譯。

Class cls = Class.forName("com.oracle.vo.Person");

方式二: 類名.class

要求運(yùn)行的類庫一定要有Person類

//編譯的字節(jié)碼文件中,會為每個(gè)類 定義一個(gè)靜態(tài)的屬性class 類型是Class類型
//會為每個(gè)類定義一個(gè)屬性,存儲自己類的類對象
Class cls = Person.class;

方式三: 對象.getClass()

要求運(yùn)行的類庫中一定要有Person類 當(dāng)持有了一個(gè)對象時(shí),可以根據(jù)對象獲得其類對象

Person p = new Person();
//getClass方法是Object類的方法,所有的對象都有g(shù)etClass方法
Class cls = p.getClass();

二、Class類

API方法

1. getName() 獲得類對象對應(yīng)類的類名(全類名:包名+類名)

2. getSimpleName() 獲得類對象對應(yīng)類的類名

3. getPackage() 獲得類對象對應(yīng)類的包對象

try {
    Class cls = Class.forName("com.oracle.vo.Person");
    System.out.println(cls.getName());
    System.out.println(cls.getSimpleName());
    Package page = cls.getPackage();
    System.out.println(page.getName());
    } catch (ClassNotFoundException e) {
 
    e.printStackTrace();
}

4. getField(String name) 根據(jù)名字獲得能訪問的屬性。

5. getDeclaredField(String name) 根據(jù)名字獲得屬性。

6. getDeclaredFields() 獲得所有的屬性

7. getDeclaredMethod()

8. getDeclaredConstructor(Class... types) 根據(jù)參數(shù)列表獲得構(gòu)造器

9. newInstance() 通過無參構(gòu)造器創(chuàng)建對象

10. getSuperClass() 獲得父類的類對象

三、Package類

Package對象抽象為包

四、Field類

是屬性的抽象,F(xiàn)ield類的實(shí)例就是某個(gè)屬性,F(xiàn)ield類包括了屬性名、屬性類型、屬性值、修飾范圍等。

獲得屬性對象,主要的作用是對屬性進(jìn)行賦值或取值的操作。

1. get(Object obj) 返回Object :獲得某個(gè)對象的屬性值。

2. setAccessible(boolean flag) : 設(shè)置屬性是否可訪問。

3. set(Object obj,Object value) : 設(shè)置屬性值

    public static void main(String[] args) {
        //獲得Person的類對象 ,獲得Person的Class對象
        Person p = new Person();
        p.setName("tom");
        try {
            Class cls = Class.forName("com.oracle.vo.Person");
            //獲得Person類中所有的屬性
            Field[] fields = cls.getFields();
            //獲得Person類中的name屬性
            Field field = cls.getDeclaredField("name");
            System.out.println(field.getName());
            //獲得 某個(gè)Person對象 的name屬性值
            //field: Person類的name屬性
            //設(shè)置這個(gè)屬性可訪問,忽略修飾范圍
            field.setAccessible(true);
            //設(shè)置p對象的name屬性值 為jack
            field.set(p, "jack");
            System.out.println(field.get(p));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

五、Method類

invoke(Object obj, Object ... args) 返回Object : 執(zhí)行method方法

    public static void main(String[] args) {
        //獲得Person的類對象 ,獲得Person的Class對象
        Person p = new Person();
        p.setName("tom");
        try {
            Class cls = Class.forName("com.oracle.vo.Person");
            //獲得Person類的 method(String name) 方法對象
            Method method1 = cls.getDeclaredMethod("method", String.class);
            //獲得Person類的 method() 方法對象
            Method method2 = cls.getDeclaredMethod("method");
            //method(int i,String name) 方法對象
            Method method3 = cls.getDeclaredMethod("method",int.class,String.class);
            //獲得全部方法
            Method[] methods = cls.getDeclaredMethods();
            //獲得方法要作什么? 就是要調(diào)用方法
            //obj參數(shù): 調(diào)用哪個(gè)對象的方法
            method1.invoke(p, "abc");
            System.out.println(method3.invoke(p, 10,"abcd"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

六、Constructor類

newInstance(Object ... args) 調(diào)用構(gòu)造器創(chuàng)建對象

    public static void main(String[] args) {
        //獲得Person的類對象 ,獲得Person的Class對象
        Person p = new Person();
        p.setName("tom");
        try {
            Class cls = Class.forName("com.oracle.vo.Person");
            //獲得 public Person() 構(gòu)造器
            Constructor constructor1 = cls.getDeclaredConstructor();
            //public Person(String name, int age) 構(gòu)造器
            Constructor constructor2 = cls.getDeclaredConstructor(String.class,int.class);
            //獲得構(gòu)造器的作用,要調(diào)用構(gòu)造器創(chuàng)建對象
            Object obj1 = constructor1.newInstance();
            Object obj2 = constructor2.newInstance("tom",20);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容! 

相關(guān)文章

  • springboot2版本無法加載靜態(tài)資源問題解決

    springboot2版本無法加載靜態(tài)資源問題解決

    這篇文章主要介紹了springboot2版本無法加載靜態(tài)資源問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java原生HttpClient的使用詳解

    Java原生HttpClient的使用詳解

    Java開發(fā)語言中實(shí)現(xiàn)HTTP請求的方法主要有兩種:一種是JAVA的標(biāo)準(zhǔn)類HttpUrlConnection,比較原生的實(shí)現(xiàn)方法;另一種是第三方開源框架HTTPClient。本文就將詳細(xì)講講Java中原生HttpClient的使用,需要的可以參考一下
    2022-04-04
  • 詳解Zookeeper基礎(chǔ)知識

    詳解Zookeeper基礎(chǔ)知識

    本文主要講解了Zookeeper的基礎(chǔ)知識,ZooKeeper提供了一個(gè)通用協(xié)調(diào)模式實(shí)現(xiàn)方法的開源共享庫,使程序員免于寫這類通用的協(xié)議。關(guān)于Zookeeper更多相關(guān)知識,感興趣的小伙伴參考一下這篇文章
    2021-09-09
  • Jmeter配置代理實(shí)現(xiàn)錄制過程圖解

    Jmeter配置代理實(shí)現(xiàn)錄制過程圖解

    這篇文章主要介紹了Jmeter配置代理實(shí)現(xiàn)錄制過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Spark MLlib隨機(jī)梯度下降法概述與實(shí)例

    Spark MLlib隨機(jī)梯度下降法概述與實(shí)例

    這篇文章主要為大家詳細(xì)介紹了Spark MLlib隨機(jī)梯度下降法概述與實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • elasticsearch啟動警告無法鎖定JVM內(nèi)存

    elasticsearch啟動警告無法鎖定JVM內(nèi)存

    今天小編就為大家分享一篇關(guān)于elasticsearch啟動警告無法鎖定JVM內(nèi)存,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java讀取網(wǎng)絡(luò)文件的實(shí)例代碼

    Java讀取網(wǎng)絡(luò)文件的實(shí)例代碼

    這篇文章主要介紹了Java讀取網(wǎng)絡(luò)文件的實(shí)例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java內(nèi)存模型與JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)的區(qū)別詳解

    Java內(nèi)存模型與JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)的區(qū)別詳解

    這篇文章主要介紹了Java內(nèi)存模型與JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java繪圖庫JFreeChart的使用教程

    Java繪圖庫JFreeChart的使用教程

    圖表是一種以簡單方式顯示信息的圖形,JFreeChart允許創(chuàng)建各種交互式和非交互式圖表,本文主要介紹了Java繪圖庫JFreeChart的使用教程,感興趣的可以了解一下
    2023-09-09
  • Java Spring處理循環(huán)依賴詳解

    Java Spring處理循環(huán)依賴詳解

    這篇文章主要介紹了Java中的Spring如何處理循環(huán)依賴,依賴指的是Bean與Bean之間的依賴關(guān)系,關(guān)于更多Spring?處理循環(huán)依賴的詳情,需要的朋友可以參考下面文章具體內(nèi)容
    2023-04-04

最新評論