为什么我在 printIn() 实现中找不到任何本地方法?

Why I can't find any native method in printIn() implementation?

我遍历以下语句的程序:

System.out.println("foo");

在我看来,Java 提供的所有功能最终都应该调用系统特定的 API,但我只能看到,在 println() 实现中,调用 Writer/BufferWriter/PrintStream 中的普通方法。我哪里错了?

如果查看源代码,可以看到 System.out 默认初始化为 public final static PrintStream out = nullPrintStream();

此代码仅生成一个空对象。显然,虚拟机正在某处介入并设置流。

进一步挖掘发现代码行:

private static native void setOut0(PrintStream out);

此行由您可能更熟悉的 public setOut() 调用。

不要查看源代码,因为很容易迷失在装饰流的森林中。使用调试器,找到文本实际出现在控制台上的代码。

编辑:在我的电脑上,这发生在 sun.nio.cs.StreamEncoder。我没有深入,因为我需要此 class 的源代码,而 sun.* classes 的源代码不在标准 Java 源代码之列。但是你可以下载OpenJDK源码,关联class文件,只要有足够的耐心,你就能找到System.out.println...

的秘密