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

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

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

首先,我們來(lái)認(rèn)識(shí)幾個(gè)類(lèi)。

Class(java.lang.Class)

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

比如我們運(yùn)行這一行代碼:

復(fù)制代碼 代碼如下:

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

得到的結(jié)果就是:

復(fù)制代碼 代碼如下:

class java.lang.String

Field(java.lang.reflect.Field)

這個(gè)類(lèi)表示一個(gè)字段,可以使用這個(gè)字段來(lái)訪問(wèn)類(lèi)

下面,我們來(lái)創(chuàng)建測(cè)試類(lèi):

復(fù)制代碼 代碼如下:

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";
    }
}

調(diào)用以下方法來(lái)測(cè)試上面的類(lèi):

復(fù)制代碼 代碼如下:

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

它的結(jié)果是這樣:

復(fù)制代碼 代碼如下:

Book:
title=null
length=0
pages=null

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

我們下面通過(guò)反射機(jī)制,獲取book對(duì)象中的length字段并進(jìn)行修改,查看結(jié)果:

復(fù)制代碼 代碼如下:

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

可以看到運(yùn)行結(jié)果是:

復(fù)制代碼 代碼如下:

Book:
title=null
length=9
pages=null


可以看出,length字段的值已經(jīng)被修改了。

上面修改的是int型的簡(jiǎn)單字段,事實(shí)上像title字段這樣的對(duì)象字段也是可以修改的,下面是示例:

復(fù)制代碼 代碼如下:

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);

上面的代碼輸出結(jié)果是:

復(fù)制代碼 代碼如下:

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

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

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

復(fù)制代碼 代碼如下:

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);

輸出結(jié)果如下:

復(fù)制代碼 代碼如下:

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

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

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

相關(guān)文章

  • 細(xì)談java同步之JMM(Java Memory Model)

    細(xì)談java同步之JMM(Java Memory Model)

    Java內(nèi)存模型是在硬件內(nèi)存模型上的更高層的抽象,它屏蔽了各種硬件和操作系統(tǒng)訪問(wèn)的差異性,保證了Java程序在各種平臺(tái)下對(duì)內(nèi)存的訪問(wèn)都能達(dá)到一致的效果。下面我們來(lái)一起學(xué)習(xí)下JMM
    2019-05-05
  • Java實(shí)現(xiàn)動(dòng)態(tài)日歷效果

    Java實(shí)現(xiàn)動(dòng)態(tài)日歷效果

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)動(dòng)態(tài)日歷效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java?時(shí)間相減算法題解示例

    Java?時(shí)間相減算法題解示例

    這篇文章主要為大家介紹了Java?時(shí)間相減算法題解示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Java編程獲取文本框的內(nèi)容實(shí)例解析

    Java編程獲取文本框的內(nèi)容實(shí)例解析

    這篇文章主要介紹了Java編程獲取文本框的值實(shí)例解析,將輸入的值保存在一個(gè)指定的 txt文件之中,具有一定的參考價(jià)值,需要的朋友可以了解。
    2017-09-09
  • easyexcel讀取excel合并單元格數(shù)據(jù)的操作代碼

    easyexcel讀取excel合并單元格數(shù)據(jù)的操作代碼

    這篇文章主要介紹了easyexcel讀取excel合并單元格數(shù)據(jù)的操作代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • IntelliJ IDEA中Project與Module的概念以及區(qū)別

    IntelliJ IDEA中Project與Module的概念以及區(qū)別

    這篇文章主要給大家介紹了關(guān)于IntelliJ IDEA中Project與Module的概念以及區(qū)別的相關(guān)資料,文中通過(guò)實(shí)例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Servlet實(shí)現(xiàn)統(tǒng)計(jì)頁(yè)面訪問(wèn)次數(shù)功能

    Servlet實(shí)現(xiàn)統(tǒng)計(jì)頁(yè)面訪問(wèn)次數(shù)功能

    這篇文章主要介紹了Servlet實(shí)現(xiàn)統(tǒng)計(jì)頁(yè)面訪問(wèn)次數(shù)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Spring Bean實(shí)例的創(chuàng)建及構(gòu)造器的挑選

    Spring Bean實(shí)例的創(chuàng)建及構(gòu)造器的挑選

    這篇文章主要介紹了Spring Bean實(shí)例的創(chuàng)建及構(gòu)造器的挑選,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • SpringSecurity 自定義表單登錄的實(shí)現(xiàn)

    SpringSecurity 自定義表單登錄的實(shí)現(xiàn)

    這篇文章主要介紹了SpringSecurity 自定義表單登錄的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • SpringBoot中REST API 接口傳參的實(shí)現(xiàn)

    SpringBoot中REST API 接口傳參的實(shí)現(xiàn)

    我們?cè)陂_(kāi)發(fā)?REST API?的過(guò)程中,經(jīng)常需要傳遞參數(shù),本文主要介紹了SpringBoot中REST API 接口傳參的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12

最新評(píng)論