资讯专栏INFORMATION COLUMN

Java final常量“无法更新”的问题

_ipo / 2697人阅读

摘要:举个例子类使用了这个常量,表面上是通过类取得的这个值,实际上在被编译后,其代码其实变成了通过上面的分析,要使常量修改后,其他引用的也同步改过来,就必须将引用了这个常量的重新编译后上传,这样才能同步修改。

代码中我们一般都使用一个类统一管理常量,例如:

public class AppConst {  
    public static final String STR_1 = "String1";  
    public static final String STR_2 = "String2";  
    ......  
} 

这样我们在修改常量值的时候只用在这个类中修改即可,今天我遇到了一个很费解的问题,我在SpringMVC工程中需要需改一个常量值,因为SpringMVC工程的class文件众多,所以我偷懒只将修改后编译的AppConst class文件上传到服务器替换了,结果无论怎么调用常量对应的值都没有更新过来,通过反编译调用的class文件发现,使用常量的地方,已经被替换成常量的值,也就是说编译后常量的值“就地展开”,不是“动态引用”的,经过搜索发现如下内容:

静态常量(即用 static final
修饰的变量)是编译时常量,当一个class文件编译完毕,它内部使用到的所有常量的具体值就已经确定了,不能想当然地以为它在运行时并连接常量管理类之后才会以引用方式使用常量。

举个例子

import AppConst;  
public class SomeService {  
    public void serviceJob1() {  
        System.out.println(AppConst.STR_1);  
    }  
}

类SomeService使用了STR_1这个常量,表面上是通过AppConst类取得的这个值,实际上在SomeService被编译后,其代码其实变成了

import AppConst;  
public class SomeService {  
    public void serviceJob1() {  
        System.out.println("String1");  
    }  
}

通过上面的分析,要使常量修改后,其他引用的class也同步改过来,就必须将引用了这个常量的class重新编译后上传,这样才能同步修改。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70088.html

相关文章

  • 探究finaljava作用

    摘要:关键字的字面意思是最终的不可修改的这似乎是一个看见名字就大概能知道怎么用的语法但你是否有深究过在各个场景中的具体使用方法注意事项以及背后涉及的设计思想呢一修饰变量基础修饰基本数据类型变量和引用数据类型变量相信大家都具备基本的常识被修饰的变量 final关键字的字面意思是最终的, 不可修改的. 这似乎是一个看见名字就大概能知道怎么用的语法, 但你是否有深究过final在各个场景中的具体使用方法...

    Baaaan 评论0 收藏0
  • 探究finaljava作用

    摘要:关键字的字面意思是最终的不可修改的这似乎是一个看见名字就大概能知道怎么用的语法但你是否有深究过在各个场景中的具体使用方法注意事项以及背后涉及的设计思想呢一修饰变量基础修饰基本数据类型变量和引用数据类型变量相信大家都具备基本的常识被修饰的变量 final关键字的字面意思是最终的, 不可修改的. 这似乎是一个看见名字就大概能知道怎么用的语法, 但你是否有深究过final在各个场景中的具体使用方法...

    番茄西红柿 评论0 收藏0
  • 探究finaljava作用

    摘要:关键字的字面意思是最终的不可修改的这似乎是一个看见名字就大概能知道怎么用的语法但你是否有深究过在各个场景中的具体使用方法注意事项以及背后涉及的设计思想呢一修饰变量基础修饰基本数据类型变量和引用数据类型变量相信大家都具备基本的常识被修饰的变量 final关键字的字面意思是最终的, 不可修改的. 这似乎是一个看见名字就大概能知道怎么用的语法, 但你是否有深究过final在各个场景中的具体使用方法...

    番茄西红柿 评论0 收藏0
  • [转] 再论 java final 变量

    摘要:的内存分配方式修饰变量通常情况下,变量有个地方可以赋值直接赋值,构造函数中,或是初始化块中。如就是对于变量,在声明时,如果你没有赋值,系统默认这是一个空白域,在构造函数进行初始化,如果是静态的,则可以在初始化块。 【java中为什么会有final变量】: final这个关键字的含义是这是无法改变的或者终态的; 那么为什么要阻止改变呢? java语言的发明者可能由于两个目的而阻止改变: ...

    soasme 评论0 收藏0
  • JVM JIT编译能改变某些反射执行结果

    摘要:某个测试服务器试图通过反射来修改变量的值,出现了时灵时不灵的现象。这个阈值随时会变,只是测着玩的编译是可以取消的,现在修改如下,在用反射设值后,再次执行万次直接取值现在的执行结果又是了。结论不要修改变量,会出问题的关于编译期优化的更多知识 某个测试服务器试图通过反射来修改static final变量的值,出现了时灵时不灵的现象。 开发环境无法重现。这是怎么回事呢? 先介绍背景知识 一般...

    lcodecorex 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<