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

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

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

    the journey is the reward...

    常用鏈接

    統計

    最新評論

    在運行時,你能修改final field的值嗎?

     

    以[final int x=911] , [static final int x=912]為例,jdk1.6.0_16(為何如此版本詳細,是因為下面還有個jdk的bug).

    樣例類:

    class Test { 
     private final  int x=911;//modifiers:final->18,non-final->2
     static final private  int y=912;//modifiers:final->26,non-final->10 
     public int getX(){
      return x;
     }  
     public static int getY(){
      return y;
     } 

     Java中的final field意指常量,賦值一次,不可改變.編譯器會對final field進行如下的優化:

    e.g:

    Test t=new Test();

    凡是在程序中對t.x的引用,編譯器都將以字面值911替換,getX()中的return x也會被替換成return 911;

    所以就算在運行時你改變了x的值也無濟于事,編譯器對它們進行的是靜態編譯.

    但是Test.class.getDeclaredField("x").getInt(t)除外;

     

    那么如何在運行時改變final field x的值呢?

    private final  int x=911;Field.modifiers為18,而private int x=911;Field.modifiers為2.

    所以如果我們修改Field[Test.class.getDeclaredField("x")].modifiers由18[final]變為2[non-final],那么你就可以修改x的值了.

     Test tObj=new Test();  
     Field f_x=Test.class.getDeclaredField("x");  
      
      //修改modifiers 18->2
      Field f_f_x=f_x.getClass().getDeclaredField("modifiers");
      f_f_x.setAccessible(true);  
      f_f_x.setInt(f_x, 2/*non-final*/);
      
      f_x.setAccessible(true);
      f_x.setInt(tObj, 110);//改變x的值為110.  
      System.out.println("靜態編譯的x值:"+tObj.getX()+".------.運行時改變了的值110:"+f_x.getInt(tObj));
       
      f_x.setInt(tObj, 111);//你可以繼續改變x的值為.  
      System.out.println(f_x.getInt(tObj));

    但是想恢復原來的modifiers,f_f_x.setInt(f_x, 18/*final*/);這是無效的,因為Field只會初始化它的FieldAccessor引用一次.

     

    在上面的過程中,我還發現了個jdk bug,你如果將上面的紅色代碼改為如下的代碼:

    f_f_x.setInt(f_x, 10/*這個數值是static non-final modifiers,而x是non-static的,這樣就會使f_x得到一個static FieldAccessor*/);那么會引發A fatal error has been detected by the Java Runtime Environment.并產生相應的err log文件.顯然JVM沒有對這種情況加以處理.我已提交to sun bug report site. 

    sun 于2010-3-26通知我,他們已承認該bug,bug id : 6938467.發布到外網可能有一到兩天的延遲.

    http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6938467 

     

     

     

    posted on 2010-03-18 09:36 adapterofcoms 閱讀(704) 評論(2)  編輯  收藏 所屬分類: java techs

    評論

    # re: 在運行時,你能修改final field的值嗎? 2011-01-06 10:02 我們

    有的bug只是新功能的,其實不是bug  回復  更多評論   

    # re: 在運行時,你能修改final field的值嗎? 2011-01-06 10:03 我們

    真正的bug是自身矛盾  回復  更多評論   

    主站蜘蛛池模板: 亚洲卡一卡2卡三卡4卡无卡三| 久久精品国产精品亚洲| 亚洲日韩乱码中文无码蜜桃| a级男女仿爱免费视频| 亚洲精品国产电影| 一区二区视频在线免费观看| 久久精品夜色噜噜亚洲A∨| 又硬又粗又长又爽免费看| 中文字幕在亚洲第一在线| 高清免费久久午夜精品| 亚洲综合无码AV一区二区| 免费看少妇高潮成人片| 亚洲小视频在线观看| 国产国产人免费视频成69堂| 亚洲久悠悠色悠在线播放| 日本大片在线看黄a∨免费| 色多多免费视频观看区一区| 亚洲中文字幕无码爆乳av中文| a视频在线观看免费| 亚洲最大黄色网站| 日韩免费一级毛片| 国产精品午夜免费观看网站| 亚洲av网址在线观看| 18禁超污无遮挡无码免费网站国产| 亚洲αⅴ无码乱码在线观看性色| 亚洲成AⅤ人影院在线观看| 久久久国产精品无码免费专区| 亚洲中文字幕无码av在线| 国产一区二区三区在线观看免费 | 国产免费一区二区三区VR| 国产特级淫片免费看| 亚洲乱码国产乱码精品精| 67pao强力打造67194在线午夜亚洲 | 一区二区亚洲精品精华液| 国产va精品免费观看| 小说专区亚洲春色校园| 国产A在亚洲线播放| 好男人www免费高清视频在线 | 美女视频黄免费亚洲| 国产黄色一级毛片亚洲黄片大全| 97免费人妻在线视频|