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

java反射機制實戰(zhàn)示例分享

 更新時間:2014年03月02日 16:17:07   作者:  
這篇文章主要介紹了java反射機制實戰(zhàn)示例,需要的朋友可以參考下

首先,我們來認識幾個類。

Class(java.lang.Class)

Class對象是一個特殊對象,每一個類都有一個Class對象,用來創(chuàng)建該類的“常規(guī)”對象??梢酝ㄟ^對象的getClass()方法獲取。

比如我們運行這一行代碼:

復制代碼 代碼如下:

System.out.println("測試".getClass().toString());

得到的結果就是:

復制代碼 代碼如下:

class java.lang.String

Field(java.lang.reflect.Field)

這個類表示一個字段,可以使用這個字段來訪問類

下面,我們來創(chuàng)建測試類:

復制代碼 代碼如下:

class Book {
    public String title;
    public int length = 0;
    public ArrayList<Page> pages = null;

    @Override
    public String toString() {
        String sb = "Book:\n";
        sb += "title="+title+"\n";
        sb += "length=" + length + "\n";
        sb += "pages=" + pages + "\n";
        if (pages != null) {
            for (Page page : pages) {
                sb += page.toString();
            }
        }
        return sb.toString();
    }
}

class Page {
    @Override
    public String toString() {
        return "page\n";
    }
}

調用以下方法來測試上面的類:

復制代碼 代碼如下:

Book book = new Book();
System.out.println(book);

它的結果是這樣:

復制代碼 代碼如下:

Book:
title=null
length=0
pages=null

這是book對象的初始狀態(tài)

我們下面通過反射機制,獲取book對象中的length字段并進行修改,查看結果:

復制代碼 代碼如下:

Book book = new Book();
Class<?> aClass = book.getClass();
Field field = aClass.getField("length");
field.setInt(book, 9);
System.out.println(book);

可以看到運行結果是:

復制代碼 代碼如下:

Book:
title=null
length=9
pages=null


可以看出,length字段的值已經被修改了。

上面修改的是int型的簡單字段,事實上像title字段這樣的對象字段也是可以修改的,下面是示例:

復制代碼 代碼如下:

Book book = new Book();
Class<?> aClass = book.getClass();
Field[] fields = aClass.getFields();
for (Field field : fields) {
    field.setAccessible(true);
    if(field.getType().equals(String.class)){
        field.set(book, "格林童話");
    }else if(field.getType().equals(int.class)){
        field.set(book, 199);
    }
}
System.out.println(book);

上面的代碼輸出結果是:

復制代碼 代碼如下:

Book:
title=格林童話
length=199
pages=null

事實上,是將所有String類型的字段都修改成“格林童話”,將所有int類型字段都修改成199 。我們甚至根本不知道這個字段代表什么意思。

下面,我們對pages這個字段進行修改。這個字段是個ArrayList,我們將創(chuàng)建一個ArrayList對象,并向其中插入一個對象。

復制代碼 代碼如下:

Book book = new Book();
Class<?> aClass = book.getClass();
Field[] fields = aClass.getFields();
for (Field field : fields) {
    field.setAccessible(true);
    if(field.getType().equals(ArrayList.class)){
        String genric = field.getGenericType().toString();
        String genricClass = genric.substring(
                            genric.indexOf('<') + 1,
                            genric.indexOf('>'));
        Class<?> entityClass = Class.forName(genricClass);
        Object obj = entityClass.newInstance();
        ArrayList list = new ArrayList();
        list.add(obj);
        field.set(book, list);
        }
    }
System.out.println(book);

輸出結果如下:

復制代碼 代碼如下:

Book:
title=null
length=0
pages=[page
]
Page

可以看出,盡管我們根本沒有直接使用Page類,但還是創(chuàng)建出了一個Page對象。

Page對象的創(chuàng)建語句在:entityClass.newInstance()這一句。newInstance語句是Class對象的重要方法,用來創(chuàng)建這個類對應的對象。當然,需要類的構造方法支持。另外,通過genGenericType方法,我們可以獲取到字段的類型修飾符。放在這里,獲取到的就是ArrayList<Page>。有了這一個字符串,我們就可以通過類加載器Class.forName來加載Page類并創(chuàng)建一個Page對象了。

相關文章

  • Java靜態(tài)工廠方法的實例詳解

    Java靜態(tài)工廠方法的實例詳解

    這篇文章主要介紹了 Java靜態(tài)工廠方法的實例詳解的相關資料,希望通過本文大家能掌握java今天工廠方法,需要的朋友可以參考下
    2017-09-09
  • 關于BufferedReader的read()和readLine()的區(qū)別

    關于BufferedReader的read()和readLine()的區(qū)別

    這篇文章主要介紹了關于BufferedReader的read()和readLine()的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringMVC生成的驗證碼圖片不顯示問題及解決方法

    SpringMVC生成的驗證碼圖片不顯示問題及解決方法

    這篇文章主要介紹了SpringMVC生成的驗證碼圖片不顯示問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • MybatisPlus使用注解的多對多級聯(lián)查詢方式

    MybatisPlus使用注解的多對多級聯(lián)查詢方式

    這篇文章主要介紹了MybatisPlus使用注解的多對多級聯(lián)查詢方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Spring循環(huán)依賴的解決方法詳解

    Spring循環(huán)依賴的解決方法詳解

    Spring的解決循環(huán)依賴是有前置條件的,要解決循環(huán)依賴我們首先要了解Spring Bean對象的創(chuàng)建過程和依賴注入的方式。依賴注入方式,我之前的博客有所分享,大家可以在看本篇文章之前進行一下小小的回顧
    2022-08-08
  • SpringBoot 統(tǒng)一請求返回的實現

    SpringBoot 統(tǒng)一請求返回的實現

    這篇文章主要介紹了SpringBoot 統(tǒng)一請求返回的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • 使用Lombok @Builder注解導致默認值無效的問題

    使用Lombok @Builder注解導致默認值無效的問題

    這篇文章主要介紹了使用Lombok @Builder注解導致默認值無效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java實現ATM銀行管理系統(tǒng)(控制臺版本)

    Java實現ATM銀行管理系統(tǒng)(控制臺版本)

    這篇文章主要為大家詳細介紹了如何利用Java語言實現控制臺版本的ATM銀行管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Java使用wait和notify實現線程之間的通信

    Java使用wait和notify實現線程之間的通信

    Java 線程通信是將多個獨立的線程個體進行關聯(lián)處理,使得線程與線程之間能進行相互通信,下面這篇文章主要給大家介紹了關于Java使用wait和notify實現線程之間通信的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • 5種Java中數組的拷貝方法總結分享

    5種Java中數組的拷貝方法總結分享

    這篇文章主要介紹了5種Java中數組的拷貝方法總結分享,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07

最新評論

三门峡市| 大石桥市| 洪洞县| 贺州市| 沭阳县| 江津市| 启东市| 枣庄市| 淅川县| 乾安县| 武平县| 朝阳区| 普兰店市| 文成县| 昌邑市| 华宁县| 鄯善县| 长寿区| 榆树市| 封丘县| 酒泉市| 石门县| 沾益县| 南郑县| 黎城县| 乐陵市| 宁海县| 大名县| 二手房| 昭通市| 合川市| 三门峡市| 分宜县| 高密市| 芜湖县| 丁青县| 五莲县| 沅陵县| 清远市| 西城区| 平邑县|