IBM Java V9 静态字段引用已复制到 class 文件中
IBM Java V9 Static field reference copied in class file
我有两个 Java classes 位于部署在 IBM Websphere App Server 7.0 上的不同 jar 中(它有点旧,但我被迫在项目中使用它)。
第一个 class 有一个静态最终字段:
public class TFFVERSION {
public static final String ACTUAL_VERSION = "8.3";
}
第二个在非静态方法中使用字段:
xslTemplate = String.format("%s_v%s", xslTemplate, TFFVERSION.ACTUAL_VERSION);
我想了解的是为什么编译器将常量 8.3
的副本放在 String.format
调用中?这使得在不重新编译和重新部署第二个的情况下仅更改第一个 class 是不可能的。
这是IBM Java V9中的一种优化还是Bug?
我在文本编辑器中打开 class 文件显示了问题(图片可点击以获得更好的分辨率):
Java 反编译器显示正确的静态字段调用。第二个 class.
中没有其他 8.3
常量
这是它通常的工作方式,它是由 javac 完成的,而不是由 IBM 的 Java 版本完成的。创建两个 class,其中一个使用另一个的静态最终常量和 运行,然后仅使用该常量重新编译 class,看看会发生什么。或者看看字节码。
如果您希望能够在线更改常量,请使用方法公开它并在 运行 时支付少量性能成本。
我有两个 Java classes 位于部署在 IBM Websphere App Server 7.0 上的不同 jar 中(它有点旧,但我被迫在项目中使用它)。
第一个 class 有一个静态最终字段:
public class TFFVERSION {
public static final String ACTUAL_VERSION = "8.3";
}
第二个在非静态方法中使用字段:
xslTemplate = String.format("%s_v%s", xslTemplate, TFFVERSION.ACTUAL_VERSION);
我想了解的是为什么编译器将常量 8.3
的副本放在 String.format
调用中?这使得在不重新编译和重新部署第二个的情况下仅更改第一个 class 是不可能的。
这是IBM Java V9中的一种优化还是Bug?
我在文本编辑器中打开 class 文件显示了问题(图片可点击以获得更好的分辨率):
Java 反编译器显示正确的静态字段调用。第二个 class.
中没有其他8.3
常量
这是它通常的工作方式,它是由 javac 完成的,而不是由 IBM 的 Java 版本完成的。创建两个 class,其中一个使用另一个的静态最终常量和 运行,然后仅使用该常量重新编译 class,看看会发生什么。或者看看字节码。
如果您希望能够在线更改常量,请使用方法公开它并在 运行 时支付少量性能成本。