Java學習筆記_反射_Class.forName()加載並修改一個類的私有成員變量

我相信實例比文字更能說明問題


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兩步做的事情.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章