繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM