首先,我們來認識幾個類。
Class(java.lang.Class)
Class對象是一個特殊對象,每一個類都有一個Class對象,用來創建該類的“常規”對象。可以通過對象的getClass()方法獲取。
比如我們運行這一行代碼:
得到的結果就是:
Field(java.lang.reflect.Field)
這個類表示一個字段,可以使用這個字段來訪問類
下面,我們來創建測試類:
@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對象中的length字段并進行修改,查看結果:
可以看到運行結果是:
上面修改的是int型的簡單字段,事實上像title字段這樣的對象字段也是可以修改的,下面是示例:
上面的代碼輸出結果是:
事實上,是將所有String類型的字段都修改成“格林童話”,將所有int類型字段都修改成199 。我們甚至根本不知道這個字段代表什么意思。
下面,我們對pages這個字段進行修改。這個字段是個ArrayList,我們將創建一個ArrayList對象,并向其中插入一個對象。
輸出結果如下:
可以看出,盡管我們根本沒有直接使用Page類,但還是創建出了一個Page對象。
Page對象的創建語句在:entityClass.newInstance()這一句。newInstance語句是Class對象的重要方法,用來創建這個類對應的對象。當然,需要類的構造方法支持。另外,通過genGenericType方法,我們可以獲取到字段的類型修飾符。放在這里,獲取到的就是ArrayList<Page>。有了這一個字符串,我們就可以通過類加載器Class.forName來加載Page類并創建一個Page對象了。
新聞熱點
疑難解答