4

我有一个 OSGi 包 b1 导出一个类

public static final String MYVAL = "a"; //version 1

第二个包 b2 使用 b1 的版本 1 编译和部署。

稍后我将 b1 中的值更改为

public static final String MYVAL = "b"; //version 2

但我只重新编译部署b1,b2不变,没有重新编译。

b2 是否有可能a在运行时仍然看到价值?

4

1 回答 1

8

引用的静态最终原语或字符串的值直接内联到使用类中。因此,与 OSGI 和任何可见性规则无关,b2仍将包含MYVAL“a”的嵌入值。

我认为这记录在Java 语言规范第 13.4 节中:

如果字段是常量变量(第 4.12.4 节),则删除关键字 final 或更改其值不会因导致它们不运行而破坏与预先存在的二进制文件的兼容性,但它们不会看到任何新的使用值除非它们被重新编译。即使用法本身不是编译时常量表达式(第 15.28 节)也是如此。

This answer to a similar question显示了一种解决方法。更改声明使其不再是常量表达式会禁用此内联行为。

public static final String MYVAL = String.valueOf("a");
于 2012-05-10T08:00:38.807 回答