程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java反射機制實戰示例分享

java反射機制實戰示例分享

編輯:關於JAVA

java反射機制實戰示例分享。本站提示廣大學習愛好者:(java反射機制實戰示例分享)文章只能為提供參考,不一定能成為您想要的結果。以下是java反射機制實戰示例分享正文


起首,我們來熟悉幾個類。

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對象了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved