国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - java反射機制實戰(zhàn)示例分享

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

2019-11-12 14:26java教程網(wǎng) JAVA教程

這篇文章主要介紹了java反射機制實戰(zhàn)示例,需要的朋友可以參考下

首先,我們來認(rèn)識幾個類。

Class(java.lang.Class)

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

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

 

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

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

 

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

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


class java.lang.String

 

Field(java.lang.reflect.Field)

 

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

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

 

復(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)用以下方法來測試上面的類:

 

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

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

 

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

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

Book:
title=null
length=0
pages=null

 

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

我們下面通過反射機制,獲取book對象中的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);

 

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

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

Book:
title=null
length=9
pages=null



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

 

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

 

復(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

 

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

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

 

復(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

 

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩亚洲视频 | 一级视频免费观看 | 久久久毛片 | 99精品久久久| 久久人体视频 | 久久久性 | 精品视频一区二区三区四区 | 国产免费网址 | 青青国产在线视频 | 国产99久久精品 | 羞羞视频在线免费观看 | 欧美日韩一区二区在线播放 | 亚洲精品乱码8久久久久久日本 | 色综合久久天天综合网 | 久久久国色 | 国产精品久久久久久久久免费桃花 | 国产一区中文字幕 | 久久伊人网视频 | 国产一区二区久久 | 久久国产精品一区二区 | 成人激情免费 | 亚洲aⅴ网站 | 日韩成人影院 | 免费看毛片的网站 | 欧美在线影院 | 欧美精品一区二区三区蜜桃视频 | 日本videos18高清hd下 | 亚洲视频在线观看免费 | www.亚洲精品| 久久中文视频 | 经典法国性xxxx精品 | 精品伦精品一区二区三区视频 | 男人午夜天堂 | 一区二区三区久久久 | 国产精品久久久久久久久久久久| 国产欧美精品区一区二区三区 | 99re在线观看视频 | 激情欧美日韩一区二区 | 欧美精品国产精品 | 亚洲 在线 | 久久精品国产亚洲一区二区三区 |