<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    咖啡伴侶

    呆在上海
    posts - 163, comments - 156, trackbacks - 0, articles - 2

    通過反射修改類的私有字段值,調用私有方法

    Posted on 2008-06-21 11:40 oathleo 閱讀(372) 評論(0)  編輯  收藏 所屬分類: Java

    下面這個例子在實際項目中一般都不會這么用,只是用來說明怎么通過反射修改類的私有字段的值.

    有一個類TestData:

    public class TestData {
    ?private String name = "1";
    ?
    ?public String getName() {
    ??return name;
    ?}
    }
    在運行的時候怎么來修改name的值呢?

    public class TestReflection extends TestCase {
    ?public void testSetPrivateField() throws Exception {
    ??TestData data = new TestData();
    ??System.out.println(data.getName());
    ? Assert.assertEquals("1", data.getName());
    ??Field f = data.getClass().getDeclaredField("name");
    ??f.setAccessible(true);
    ??f.set(data, "2");
    ??System.out.println(data.getName());
    ? Assert.assertEquals("2", data.getName());
    ?}
    }
    運行結果:
    1
    2
    其中,最關鍵的代碼是:
    f.setAccessible(true);
    這行代碼把對象data上的name字段設置為public訪問屬性.

    既然私有字段可以這樣訪問,那么,類似的,私有方法也可以這樣調用!
    改一下TestData:

    public class TestData {
    ?private String name = "1";
    ?
    ?public String getName() {
    ??return name;
    ?}
    ?
    ?private void setName(String name) {
    ??this.name = name;
    ?}
    }
    在TestData中增加了私有的setName方法,下面是測試代碼:
    public class TestReflection extends TestCase {?
    ?public void testInvokePrivateMethod() throws Exception {
    ??TestData data = new TestData();
    ??System.out.println(data.getName());
    ? Assert.assertEquals("1", data.getName());
    ??Method m = data.getClass().getDeclaredMethod("setName", String.class);
    ??m.setAccessible(true);
    ??m.invoke(data, "3");
    ??System.out.println(data.getName());
    ? Assert.assertEquals("3", data.getName());
    ?}
    }
    運行結果:
    1
    3
    其中最關鍵的代碼行是:
    m.setAccessible(true);
    它把對象data的setName方法的訪問屬性設置為public.

    那么這樣調用私有方法,訪問私有屬性有什么用處呢?
    在實際項目中,我們會使用很多其它第三方的包,有的時候是通過修改源代碼完成你想要的功能,有的時候,是因為第三方包中僅僅因為某幾個方法的訪問屬性被設置為private,或者只要修改private的字段值即可.這個時候,用這種反射的方法就可以很容易實現了.

    另外一個場景就是從系統架構層來考慮數據封裝.例如系統有一些元數據類,99%的情況下,我們只是提供get方法供其它應用層獲得字段的值,如果把修改的 set方法也提供出去,那么可能會影響到系統的可維護性.而在系統運行期間,又很難避免的要修改這些元數據的值.這種情況下,也可以通過這種反射的方式來 實現.

    主站蜘蛛池模板: 一个人免费观看www视频| 中文在线日本免费永久18近| 亚洲av专区无码观看精品天堂 | 青娱乐免费在线视频| 四虎1515hm免费国产| 亚洲av网址在线观看| 亚洲最大天堂无码精品区| 香蕉免费在线视频| 在线免费观看色片| 亚洲国产精品久久久久网站 | 亚洲高清最新av网站| 亚洲视频在线观看免费| 无码av免费网站| 国产精品无码一二区免费| 亚洲国产精品久久久久久| 国产成人免费在线| 国产精品成人免费一区二区 | 麻豆国产VA免费精品高清在线 | 国产老女人精品免费视频| 国产亚洲美女精品久久久久| 99视频在线免费| 亚洲精品无码午夜福利中文字幕 | 成人爱做日本视频免费| 久久亚洲私人国产精品vA| 中国一级全黄的免费观看| 亚洲AV成人片色在线观看高潮| 97国产在线公开免费观看| 亚洲va久久久噜噜噜久久狠狠| 四虎影视在线看免费观看| 国产色爽女小说免费看| 一级中文字幕免费乱码专区| 亚洲Av永久无码精品三区在线| 免费看男女下面日出水来| 国产精品日本亚洲777| 亚洲中文字幕无码爆乳AV| 亚洲av成人一区二区三区在线播放| 91久久青青草原线免费| 亚洲精品日韩一区二区小说| 最近的免费中文字幕视频| 456亚洲人成在线播放网站| 免费毛片a在线观看67194|