初始化中的静态字段问题



我在JDK中搜索了很多次,但找不到out字段在哪里初始化

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

那么,System类中的这些静态字段是什么时候初始化的呢?

在openjdk-11java.lang.System的1968 线上

setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));

它在private static void initPhase1()中,并记录到

初始化系统类。在线程初始化后调用。

我建议您先检查FileDescriptor.java,然后再回来更彻底地检查System.java。您可以在java安装的src文件夹中轻松找到这些文件。

我从这些文件中复制了一些代码,这里以out为例,但你可以很容易地以非常相似的方式找到in和err的答案。

来自FileDescriptor.java

public static final FileDescriptor out = new FileDescriptor(1);

来自System.java

public static void setOut(PrintStream out) {
checkIO();
setOut0(out);
private static native void setOut0(PrintStream out);
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));

请记住,这些行是不相连的,我没有复制回答您问题所需的所有代码,只复制了一些最鼓舞人心的代码。因此,尽可能多地阅读这两个java文件,以便更好地理解。

还要记住,并不是所有的java";能力";在java中实现,即

setOut0();

我还没有在java源文件中找到它的实现,因为它应该通过其他方式实现。

最新更新