栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java最终字段编译时常量表达式

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java最终字段编译时常量表达式

我无法理解可能无法观察到对最终字段的更改

它表明,如果将最终变量声明为编译时间常数,则在执行过程中,程序中进一步使用 反射API 对最终变量进行的任何更改将对程序不可见。
例如,考虑以下代码:

import java.lang.reflect.*;class ChangeFinal {    private final int x = 20;//compile time constant    public static void change(ChangeFinal cf)    {        try        { Class clazz = ChangeFinal.class; Field field = clazz.getDeclaredField("x"); field.setAccessible(true); field.set(cf , 190);//changed x to 190 for object cf        }        catch (Exception ex)        { ex.printStackTrace();        }    }    public static void main(String[] args)     {        ChangeFinal cf = new ChangeFinal();        System.out.println(cf.x);//prints 20        change(cf);        System.out.println(cf.x);//prints 20    }}

上面代码的输出是:

2020

为什么?
答案在于

javap -c
命令为公共静态void main 提供的输出:

public static void main(java.lang.String[]);  Code:   0:   new     #3; //class ChangeFinal   3:   dup   4:   invokespecial   #11; //Method "<init>":()V   7:   astore_1   8:   getstatic       #12; //Field java/lang/System.out:Ljava/io/PrintStream;   11:  aload_1   12:  invokevirtual   #13; //Method java/lang/Object.getClass:()Ljava/lang/Class;   15:  pop   16:  bipush  20   18:  invokevirtual   #14; //Method java/io/PrintStream.println:(I)V   21:  aload_1   22:  invokestatic    #15; //Method change:(LChangeFinal;)V   25:  getstatic       #12; //Field java/lang/System.out:Ljava/io/PrintStream;   28:  aload_1   29:  invokevirtual   #13; //Method java/lang/Object.getClass:()Ljava/lang/Class;   32:  pop   33:  bipush  20   35:  invokevirtual   #14; //Method java/io/PrintStream.println:(I)V   38:  return}

在第16行(在

changeFinal
调用方法之前),将的值
cf.x
硬编码为
20
。在第33行(
changeFinal
调用方法之后)的值
cf.x
再次被硬编码为
20
。因此,尽管最终变量值的更改
x
是通过
reflectionAPI
在执行期间成功完成的 ,但是由于
x
是编译时常量,因此它显示了其常量值
20



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/497246.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号