我有一个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
?
答案 0 :(得分:8)
引用的静态最终基元或字符串的值直接内联到using类中。与OSGI和任何可见性规则无关,b2
仍将包含“a”的嵌入式MYVAL
值。
我认为Java Language Specification, Section 13.4中记录了这一点:
如果某个字段是常量变量(§4.12.4),则删除关键字final或更改其值不会破坏与预先存在的二进制文件的兼容性,导致它们不能运行,但是它们将看不到除非重新编译,否则使用该字段的任何新值。即使用法本身不是编译时常量表达式(第15.28节),也是如此。
This answer to a similar question显示了一种解决方法。更改声明使其不再是常量表达式会禁用此内联行为。
public static final String MYVAL = String.valueOf("a");