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

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

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

    posts - 495,comments - 227,trackbacks - 0
    http://ljhzzyx.blog.163.com/blog/static/3838031220141011111435161/

    java中,final標識的變量是不可修改的,但是通過反射的方式達到修改的目的。修改的示例也很簡單,在這里 http://stackoverflow.com/questions/2474017/using-reflection-to-change-static-final-file-separatorchar-for-unit-testing
    public class EverythingIsTrue {
        static void setFinalStatic(Field field, Object newValue) throws Exception {
            field.setAccessible(true);
            Field modifiersField = Field.class.getDeclaredField("modifiers");
            modifiersField.setAccessible(true);
            modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
            field.set(null, newValue);
        }
        public static void main(String args[]) throws Exception {
            setFinalStatic(Boolean.class.getField("FALSE"), true);
            System.out.format("Everything is %s", false); // "Everything is true"
        }
    }
        關鍵點在于.setAccessible(true),并且修改modifiers去除final屬性。獲得修飾符的方式可以通過java.lang.reflect.Modifier,詳細說明在這里
    http://blog.csdn.net/xiao__gui/article/details/8141216
    通過Modifier的isPublic、isPrivate、isStatic等方法,可以判斷是否包含某些修飾符
    boolean isStatic = Modifier.isStatic(field.getModifiers());
    if(isStatic) {
        System.out.println(field.get(null).toString());
    }
    這里的field是靜態類型的,因此field.get(null)方法的參數,可以是null,也可以是A.class這樣的目標類,不用提供實例對象。查看java.lang.reflect.Modifier的代碼,可以知道對修飾符的定義是通過二進制位來實現的。上面文章中有舉例

    public static,對應的整數就是二進制的:1001,也就是9。如下:

    ……

    native

    transient

    volatile

    synchronized

    final

    static

    protected

    private

    public

     

    0

    0

    0

    0

    0

    1

    0

    0

    1


    源碼中的完整定義如下
    public static final int PUBLIC           = 0x00000001;
    public static final int PRIVATE          = 0x00000002;
    public static final int PROTECTED        = 0x00000004;
    public static final int STATIC           = 0x00000008;
    public static final int FINAL            = 0x00000010;
    public static final int SYNCHRONIZED     = 0x00000020;
    public static final int VOLATILE         = 0x00000040;
    public static final int TRANSIENT        = 0x00000080;
    public static final int NATIVE           = 0x00000100;
    public static final int INTERFACE        = 0x00000200;
    public static final int ABSTRACT         = 0x00000400;
    public static final int STRICT           = 0x00000800;
    根據數值,得到完整的順序是這樣的
    strict,abstract,interface,native,transient,volatile,synchronized,final,static,protected,private,public
          由此就可以了解field.getModifiers() & ~Modifier.FINAL這部分的含義的,先~Modifier.FINAL將final所在的位設置為0,其他所有位設置為1。field.getModifiers() & ~Modifier.FINAL與的操作,就是將field的modifiers屬性修飾符中final給去除掉。
          但是在自己嘗試的過程中,發現一個問題。設置final變量的方法是field.set(),如果在這個方法之前調用了field.get()方法,順序如下面這樣
    field.get(null).toString();
    ...
    field.set(null, newValue);
    這時對final變量的賦值就會報錯,就算.setAccessible(true);也是沒有用的。具體原因尚不清楚,估計需要跟蹤源碼才能查清楚。

          需要注意的是,對于int、long、boolean以及String等基本類型,由于編譯器優化的原因,很多使用常量的地方的值還是原來的數值。如
    if (index > maxFormatRecordsIndex) {
        index  =  maxFormatRecordsIndex;
    }
    maxFormatRecordsIndex為final,則被編譯器改成這樣
    if (index > 100) {
        index = 100;
    }
    System.out.println(Bean.INT_VALUE);
    //編譯時會被優化成下面這樣:
    System.out.println(100);
    所以正常的使用方式還是獲取原來的值,獲得修改后的final常量的值需要用field.get(null)這樣的方式。
          總體來講,改基本類型的final常量的用處還是不大,如果是非基本類型常量,則有實際意義。
    posted on 2016-06-28 17:32 SIMONE 閱讀(1650) 評論(0)  編輯  收藏 所屬分類: JAVA
    主站蜘蛛池模板: 热久久精品免费视频| 亚洲AV无码成人精品区天堂 | 亚洲伊人久久大香线蕉啊| 免费国产在线视频| 亚洲国产综合专区电影在线 | 成人免费无遮挡无码黄漫视频| 亚洲人成高清在线播放| 无码人妻精品中文字幕免费东京热| 中文字幕在线观看亚洲| xxxxwww免费| 亚洲伦理中文字幕| 国产自产拍精品视频免费看| 男性gay黄免费网站| 亚洲黄片毛片在线观看| 中国黄色免费网站| 亚洲一区二区三区四区在线观看| 57pao国产成永久免费视频| 中文字幕 亚洲 有码 在线 | 暖暖日本免费中文字幕| 亚洲成人免费在线观看| 全免费a级毛片免费看无码| 深夜特黄a级毛片免费播放| 国产自偷亚洲精品页65页| 久久精品毛片免费观看| 亚洲综合一区国产精品| 亚洲国产午夜福利在线播放| 精品成人免费自拍视频| 亚洲乱人伦精品图片| 亚洲高清无码专区视频| 日本视频免费高清一本18| 亚洲一卡2卡3卡4卡乱码 在线| 国产大片51精品免费观看| 国色精品va在线观看免费视频 | 免费一级毛片在线播放视频免费观看永久 | 婷婷国产偷v国产偷v亚洲| 亚洲日韩乱码中文无码蜜桃臀网站| 久久精品人成免费| 日韩免费高清一级毛片| 亚洲美女大bbbbbbbbb| 国产v片免费播放| 免费A级毛片无码A∨|