gpt4 book ai didi

java - 是否可以禁用 javac 的静态最终变量内联?

转载 作者:IT老高 更新时间:2023-10-28 20:28:15 27 4
gpt4 key购买 nike

Java 静态编译器 (javac) 内联了一些静态最终变量,并将这些值直接带入常量池。考虑以下示例。 A类定义了一些常量(public static final variables):

public class A {
public static final int INT_VALUE = 1000;
public static final String STRING_VALUE = "foo";
}

B 类使用这些常量:

public class B {
public static void main(String[] args) {
int i = A.INT_VALUE;
System.out.println(i);
String s = A.STRING_VALUE;
System.out.println(s);
}
}

当你编译类 B 时,javac 从类 A 中获取这些常量的值并将这些值内联到 B.class 中。结果,在编译时对类 A 的依赖 B 已从字节码中删除。这是一种相当奇特的行为,因为您在编译时正在烘焙这些常量的值。你会认为这是 JIT 编译器在运行时可以做的最简单的事情之一。

是否有任何方法或任何隐藏的编译器选项可以让您禁用 javac 的这种内联行为?作为背景,我们正在研究出于依赖性目的进行字节码分析,这是字节码分析无法检测编译时依赖性的少数情况之一。谢谢!

编辑:这是一个令人烦恼的问题,因为通常我们不会控制所有源(例如定义常量的第三方库)。我们有兴趣从使用常量的角度检测这些依赖关系。由于引用已从使用常量的代码中删除,因此没有简单的方法来检测它们,除非进行源代码分析。

最佳答案

Java Puzzlers (Joshua Bloch) 的第 93 项说,您可以通过防止最终值被视为常量来解决此问题。例如:

public class A {
public static final int INT_VALUE = Integer.valueOf(1000).intValue();
public static final String STRING_VALUE = "foo".toString();
}

当然,如果您无权访问定义常量的代码,这一切都无关紧要。

关于java - 是否可以禁用 javac 的静态最终变量内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3524150/

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