公共静态final和OSGi的编译器优化

时间:2012-05-10 06:52:38

标签: java osgi compiler-optimization

我有一个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

1 个答案:

答案 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");