为什么我不能在printIng()实现中找到任何本机方法?

时间:2015-03-15 23:41:56

标签: java io implementation

我通过以下声明的程序:

System.out.println("foo");

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

2 个答案:

答案 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的秘密......