Lee*_*len 4 java osgi compiler-optimization
我有一个OSGi包b1导出一个类
public static final String MYVAL = "a"; //version 1
Run Code Online (Sandbox Code Playgroud)
使用b1的版本1编译和部署第二个包b2.
稍后我将b1中的值更改为
public static final String MYVAL = "b"; //version 2
Run Code Online (Sandbox Code Playgroud)
但我只重新编译和部署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");
Run Code Online (Sandbox Code Playgroud)