![](/img/trans.png)
[英]why compiler says a public static field in interface is “final” although it is not
[英]Compiler optimization of public static final and OSGi
我有一个OSGi包b1导出一个类
public static final String MYVAL = "a"; //version 1
使用b1的版本1编译和部署第二个包b2。
稍后我将b1中的值更改为
public static final String MYVAL = "b"; //version 2
但我只重新编译和部署b1,b2没有改变,也没有重新编译。
是否有可能b2在运行时仍然看到值a
?
引用的静态最终基元或字符串的值直接内联到using类中。 与OSGI和任何可见性规则无关, b2
仍将包含嵌入的MYVAL
值“a”。
我认为这在Java语言规范第13.4节中有记录 :
如果字段是常量变量(§4.12.4),则删除关键字final或更改其值不会破坏与预先存在的二进制文件的兼容性,导致它们不能运行,但是它们不会看到任何新值的用法该字段除非重新编译 。 即使用法本身不是编译时常量表达式(第15.28节),也是如此。
对类似问题的回答显示了一种解决方法。 更改声明使其不再是常量表达式会禁用此内联行为。
public static final String MYVAL = String.valueOf("a");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.