<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.

    通過反射修改類的私有字段值,調(diào)用私有方法

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

    有一個類TestData:

    public class TestData {
     private String name = "1";
     
     public String getName() {
      return name;
     }
    }
    在運(yùn)行的時候怎么來修改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());
     }
    }
    運(yùn)行結(jié)果:
    1
    2
    其中,最關(guān)鍵的代碼是:
    f.setAccessible(true);
    這行代碼把對象data上的name字段設(shè)置為public訪問屬性.

    既然私有字段可以這樣訪問,那么,類似的,私有方法也可以這樣調(diào)用!
    改一下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());
     }
    }
    運(yùn)行結(jié)果:
    1
    3
    其中最關(guān)鍵的代碼行是:
    m.setAccessible(true);
    它把對象data的setName方法的訪問屬性設(shè)置為public.

    那么這樣調(diào)用私有方法,訪問私有屬性有什么用處呢?
    在實(shí)際項(xiàng)目中,我們會使用很多其它第三方的包,有的時候是通過修改源代碼完成你想要的功能,有的時候,是因?yàn)榈谌桨袃H僅因?yàn)槟硯讉€方法的訪問屬性被設(shè)置為private,或者只要修改private的字段值即可.這個時候,用這種反射的方法就可以很容易實(shí)現(xiàn)了.

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

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

    評論

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

    轉(zhuǎn)載了,謝謝。
    http://blog.csdn.net/djsl6071/archive/2008/06/20/2567918.aspx  回復(fù)  更多評論   

    主站蜘蛛池模板: 四虎影视大全免费入口| 综合偷自拍亚洲乱中文字幕 | 日韩在线天堂免费观看| www.亚洲成在线| 国产精品视频免费一区二区| 亚洲人成在线播放| 无码人妻精品中文字幕免费东京热| 亚洲成人精品久久| 19禁啪啪无遮挡免费网站| 亚洲最大视频网站| 日韩免费a级毛片无码a∨| 亚洲综合无码无在线观看| 精品免费国产一区二区| 偷自拍亚洲视频在线观看| 亚洲A丁香五香天堂网| 91精品成人免费国产片| 久久久亚洲AV波多野结衣| 免费精品国偷自产在线在线 | 国产成人精品日本亚洲| 国产精品区免费视频| 亚洲高清无在码在线电影不卡| xx视频在线永久免费观看| 亚洲午夜精品久久久久久app| 国产免费人成视频在线观看 | 国产免费AV片在线观看 | 国产精品亚洲片在线观看不卡| 久久精品私人影院免费看| 亚洲制服丝袜精品久久| 国产成人精品123区免费视频| 一区二区三区免费精品视频| 91亚洲导航深夜福利| 日韩人妻无码免费视频一区二区三区| 阿v视频免费在线观看| 久久亚洲国产午夜精品理论片| 18未年禁止免费观看| 久久亚洲精品无码gv| 国产成人精品日本亚洲专区61| 69视频在线观看高清免费| 亚洲AV成人精品日韩一区18p| 久久毛片免费看一区二区三区| 亚洲综合无码一区二区|