国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java反射機制實戰示例分享

2019-11-26 15:38:18
字體:
來源:轉載
供稿:網友

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

Class(java.lang.Class)

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

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

復制代碼 代碼如下:

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

得到的結果就是:

復制代碼 代碼如下:

class java.lang.String

Field(java.lang.reflect.Field)

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

下面,我們來創建測試類:

復制代碼 代碼如下:

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對象的初始狀態

我們下面通過反射機制,獲取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,我們將創建一個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類,但還是創建出了一個Page對象。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武城县| 萨嘎县| 海伦市| 镇平县| 双柏县| 文化| 岢岚县| 贵溪市| 余姚市| 赤城县| 清水河县| 于田县| 土默特右旗| 苏尼特左旗| 绵阳市| 诸暨市| 海安县| 丰宁| 巨鹿县| 沅陵县| 师宗县| 寻乌县| 富宁县| 呼和浩特市| 海晏县| 白银市| 元阳县| 雷山县| 融水| 宣汉县| 永嘉县| 家居| 昌平区| 成安县| 武夷山市| 东港市| 襄汾县| 张掖市| 新巴尔虎左旗| 根河市| 翁源县|