【问题标题】:System.out.println in java - Is out initialized in a native method?java中的System.out.println - 是否在本机方法中初始化?
【发布时间】:2019-12-04 10:20:35
【问题描述】:

我只是想知道System.out.println() 中的out 变量是否在System 类的静态块中初始化。 out 字段被声明为最终静态变量,它等于 null (public final static PrintStream out = null;)。由于 out 指向 null,我假设它被指向某处的 PrintStream 对象。但除了名为registerNatives() 的本机方法外,我看不到代码。它是否在本机方法中被指出?为什么这样做(任何性能优势)? 此外,Systemout 变量的文档说:

“标准”输出流。此流已经打开并准备好接受输出数据。通常,此流对应于主机环境或用户指定的显示输出或其他输出目标。"

谢谢。

【问题讨论】:

  • 我猜out 只是因平台而异。所以用Java初始化它没有任何意义。然后每个平台必须根据各自的架构创建对象
  • 众所周知,JVM 对out 进行特殊处理,例如如果outfinal,你怎么能调用System.setOut() 呢?答案是它并不是最终的,JVM 已经被硬编码以忽略修饰符(尽管分配仍然是线程安全的——这也是硬编码的)。

标签: java


【解决方案1】:

参考 JDK 1.8

外出注册流程

Java Virtual Machine (JVM) 调用

private static void initializeSystemClass()line-1155

函数调用

setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")))line-1192 调用

实际的native method 已定义

private static native void setOut0(PrintStream out);line-258;

然后setOut0 然后初始化out 类成员。

【讨论】:

  • 注:库参考jdk 1.8
猜你喜欢
  • 1970-01-01
  • 2022-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多