<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 閱讀(1649) 評論(0)  編輯  收藏 所屬分類: JAVA
    主站蜘蛛池模板: 中文字幕在线免费视频| 亚洲国产精品日韩专区AV| 久久亚洲AV成人出白浆无码国产| 好湿好大好紧好爽免费视频| 国产黄色片在线免费观看| 亚洲午夜精品在线| 精品国产福利尤物免费| 国产色爽免费视频| 亚洲精品无码久久久久久| 在线a免费观看最新网站| 亚洲男人的天堂www| 亚洲Av永久无码精品一区二区| GOGOGO高清免费看韩国| 国产大片免费观看中文字幕| 亚洲a级成人片在线观看| 午夜无码A级毛片免费视频| 国产亚洲美女精品久久久| 亚洲gay片在线gv网站| 真人做人试看60分钟免费视频| 亚洲AV无码精品无码麻豆| selaoban在线视频免费精品| 小小影视日本动漫观看免费| 777亚洲精品乱码久久久久久| 人人公开免费超级碰碰碰视频| 日本久久久免费高清| 亚洲最大无码中文字幕| 国产91免费在线观看| 久久国产亚洲精品无码| 一个人看的www免费视频在线观看| 四虎在线播放免费永久视频| 亚洲18在线天美| 免费精品国产自产拍在线观看图片| 亚洲视频欧洲视频| 99视频有精品视频免费观看| 亚洲av色影在线| 国产精品视频白浆免费视频| 亚洲成色WWW久久网站| a级毛片免费全部播放无码| 国产日产亚洲系列| 黄色视频在线免费观看| 国产成人高清亚洲|