我通过以下声明的程序:
System.out.println("foo");
根据我的理解,Java提供的所有功能最终都应该调用系统特定的API,但我只能在println()实现中看到在Writer / BufferWriter / PrintStream中调用普通方法。我哪里出错?
答案 0 :(得分:1)
如果您查看源代码,可以看到System.out
默认情况下已初始化为public final static PrintStream out = nullPrintStream();
。
此代码只生成一个null对象。显然,VM正在某个地方踩踏并设置流。
进一步的挖掘找到了代码行:
private static native void setOut0(PrintStream out);
此行由公众setOut()
调用,您可能更熟悉。
答案 1 :(得分:1)
不要查看源代码,因为它很容易迷失在装饰器流的森林中。使用调试器,找到文本实际出现在控制台上的代码。
编辑:在我的电脑上,这发生在sun.nio.cs.StreamEncoder中。我没有深入,因为我需要这个类的源代码,而sun。*类的源代码不属于标准的Java源代码。但是你可以下载OpenJDK源代码,与类文件相关联,并且有足够的耐心,你可以找到System.out.println的秘密......