gpt4 book ai didi

java - 在System.java源码中,标准输入、输出和错误流都被声明为final并初始化为null?

转载 作者:行者123 更新时间:2023-12-03 18:22:23 25 4
gpt4 key购买 nike

public final static InputStream in = null;
public final static PrintStream out = null;
public final static PrintStream err = null;

但众所周知,这些流默认连接到控制台并且已经打开。 System 类中还有 setIn()、setOut 和 setErr() 方法来重定向流。当它们被声明为 final 并设置为初始化值 null 时,这怎么可能呢?

我编译了以下代码,在调用 println() 时设置断点并使用 netbeans 进行调试。我的目标是通过进入源代码来准确确定变量 System.in 何时被初始化为标准输出。但是似乎在调用 main 方法时输出流 out 已经被初始化。

public static void main(String[] args) {
System.out.println("foo");
}

最佳答案

这样做是为了防止“黑客攻击”。这些字段只能通过调用 native 方法的适当 setter 来更改

private static native void setIn0(InputStream in);
private static native void setOut0(PrintStream out);
private static native void setErr0(PrintStream err);

native 方法可以做任何事情,包括更改最终字段。

关于java - 在System.java源码中,标准输入、输出和错误流都被声明为final并初始化为null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45344475/

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