我相信實例比文字更能說明問題
Demo1,被加載的類
package com.text.hl;
public class Demo1 {
private int hl;
}
在這裏我用junit單元測試測試的,去方法中加載Demo1類獲得其私有成員變量並改變其值爲指定的值,這裏爲200.大家也可以將此方法寫在自己定義的類的Main方法中執行.依個人習慣和喜好而定.
@Test
public void testGetDemo1(){
try {
Object demo1=Class.forName("com.text.hl.Demo1").newInstance();
// 返回一個 Field 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明字段。
Field field=demo1.getClass().getDeclaredField("hl");
//跳過權限訪問檢查--暴力反射
field.setAccessible(true);
// 將指定對象變量上此 Field 對象表示的字段設置爲指定的新值。
field.set(demo1, 200);
//返回指定對象上此 Field 表示的字段的值。
System.out.println(field.get(demo1));
} catch (Exception e) {
e.printStackTrace();
}
}
這是文檔中的兩個方法,幫助大家理解.
如果需要更深層次理解,下面有一些參考博客:
參考地址1:http://yanwushu.sinaapp.com/class_forname/
參考地址2:http://www.cnblogs.com/shosky/archive/2011/07/22/2114290.html
本人爲了幫助大家理解,下面是本人通過查詢文檔和各種資料之後理解的東西,如有紕漏歡迎指出修改意見.
加載的Demo1這個類,通常我們想調用這個類中的方法和變量(當然都是public的) 就需要這樣Demo1 demo= new Demo1();創建一個這個類的實例.也就是這個類的對象.這樣就可以使用它了.
現在我們不通過new的方式獲得它的對象(實例),通過反射的方式,Class.forName();類加載器,加載這個類,獲得的是這個類的class對象,也就是其在JVM中class對象(萬物皆對象),現在獲得的只是相當於Demo1.getClass();類加載到JVM中的字節碼,這時我們需要調用newInstance方法獲得這個類的實例(對象),這樣就可以使用它了.
也就是說new是一步完成了,forName和newInstance兩步做的事情.