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

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

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

    心有多大舞臺便有多大

    Embrace changes, pursue excellence, share niceness.

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

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

    有一個類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方法也提供出去,那么可能會影響到系統的可維護性.而在系統運行期間,又很難避免的要修改這些元數據的值.這種情況下,也可以通過這種反射的方式來實現.

    posted on 2008-06-19 10:14 pony 閱讀(3327) 評論(1)  編輯  收藏 所屬分類: Java

    評論

    # re: 通過反射修改類的私有字段值,調用私有方法 2008-06-20 08:38 Matthew Chen

    轉載了,謝謝。
    http://blog.csdn.net/djsl6071/archive/2008/06/20/2567918.aspx  回復  更多評論   

    主站蜘蛛池模板: 亚洲免费一级视频| 一个人看的免费观看日本视频www| 亚洲成人免费在线| 亚洲精品乱码久久久久久按摩 | 亚洲色图在线观看| 久久久久国产精品免费网站| 亚洲国产精品成人精品无码区在线| 中文字幕成人免费高清在线视频 | 5g影院5g天天爽永久免费影院| 久久亚洲AV成人出白浆无码国产| 99在线免费观看视频| 亚洲白嫩在线观看| 免免费国产AAAAA片| 亚洲精品欧美综合四区| 免费一级毛片正在播放| 国产国产人免费人成成免视频| 亚洲国产美女精品久久久久∴| 最近2019免费中文字幕6| 亚洲午夜精品国产电影在线观看| 毛片免费观看网站| 青青草国产免费国产是公开| 欧洲亚洲国产清在高| 最近2019年免费中文字幕高清 | 免费国产在线精品一区| 亚洲小说区图片区另类春色| 69免费视频大片| 大桥未久亚洲无av码在线| 亚洲中文字幕无码爆乳AV | 最近中文字幕mv免费高清视频7 | 在线观看免费黄网站| 中文字幕亚洲色图| 国产又大又长又粗又硬的免费视频| 产传媒61国产免费| 亚洲avav天堂av在线不卡| 无码高潮少妇毛多水多水免费| 一级毛片在线播放免费| 中文字幕亚洲免费无线观看日本| 国产免费爽爽视频免费可以看| 免费成人高清在线视频| 亚洲国产精品无码久久九九大片| 国产亚洲精品自在久久|