gpt4 book ai didi

java - public static final 和 OSGi 的编译器优化

转载 作者:搜寻专家 更新时间:2023-11-01 01:45:58 25 4
gpt4 key购买 nike

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

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

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

稍后我将 b1 中的值更改为

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

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

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

最佳答案

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

我认为这记录在 Java Language Specification, Section 13.4 中:

If a field is a constant variable (§4.12.4), then deleting the keyword final or changing its value will not break compatibility with pre-existing binaries by causing them not to run, but they will not see any new value for the usage of the field unless they are recompiled. This is true even if the usage itself is not a compile-time constant expression (§15.28).

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

public static final String MYVAL = String.valueOf("a");

关于java - public static final 和 OSGi 的编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10528836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com