gpt4 book ai didi

java - System.out 和最终对象内联

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:35:44 26 4
gpt4 key购买 nike

众所周知,javac 在编译时内联常量,当仅重新编译应用程序的一部分时,这可能会导致有趣的问题,这里的每个人都知道通常的解决方案(让 javac 不明白它实际上是一个编译时常数)

但是如果我们查看 oracle JDK 的 System.class 中的代码,我们会看到以下内容:

public final static PrintStream out = null;

所以大概 out 是由 JVM 初始化中的反射或其他机制设置的。但这引出了一个问题:为什么不在这里内联 out 呢? (至少我在使用 System.out.println() 时从未遇到空指针异常)。

javac 是否对这种情况进行了特殊处理,或者这实际上是由语言规范合理处理的吗?

最佳答案

static final 构造有多个结果。文字可能被内联例如 static final int xxx = 1,这很清楚,但例如 static final int xxx = returnOne() 可能不是。

原始类型和字符串只能用文字替换,所有其他对象都不能。最后但同样重要的是 System.out/in 违反了 JLS(一旦 final 字段被初始化,它总是包含相同的值。)。

几种防止内联的方法:static final String xxx="xxx".intern();static final int yyy=123+return0(); 因为评估只能在运行时执行,javac 将生成 GETFIELD 而不是 BIPUSH(对于 int)。

关于java - System.out 和最终对象内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8127141/

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