【问题标题】:What is VMSystem in the Java class library?Java类库中的VMSystem是什么?
【发布时间】:2021-02-01 04:04:57
【问题描述】:

在我了解编程语言/编译器的过程中,我认为尝试编写 Java 类库的小版本可能会很酷。

我决定从编写自己的 println() 方法开始。不,不是简单调用 println 的方法。

到目前为止我的代码:

package maintest;

import java.io.PrintStream;
import gnu.classpath.SystemProperties;
import gnu.classpath.VMStackWalker;

public class JohnSystem {

    public static final PrintStream out = VMSystem.makeStandardOutputStream();

}

所以基本上,我写了一个“新”系统类。现在我注意到关于 OpenJDK 系统类的一些有趣的事情。 Java.lang.System 中包含的 public static final 变量“out”不会像对象通常使用 new 关键字那样被实例化。我试图模仿它的完成方式并相应地编写了上面的代码。

我认为VMSystem 是类库中的另一个类,它有一个静态方法makeStandardOutputStream(),它返回一个PrintStream 对象。

这很好,除了编译器(或者可能是 eclipse?)不识别 VMSystem 并且当我尝试导入在 OpenJDK 上找到的包时,它们也无法识别。

我指的代码在:http://developer.classpath.org/doc/java/lang/System-source.html

所以,基本上我正在尝试找出如何能够使用 VMSystem 方法。是否有我需要下载的软件包?但这并没有什么意义。既然System.out.println() 有效,那么这些包一定已经存在了,不是吗?还是可能是权限/安全问题?

谢谢!

【问题讨论】:

标签: java jvm class-library


【解决方案1】:

VMSystem 类是 Java SE 类库的(旧的,几乎已失效的)GNU ClassPath 实现中的一个内部类。

它不是 Java API 的一部分,在 OpenJDK 中也没有它的等价物;即您正在寻找的方法可能不存在。

另一方面...如果您想了解 OpenJDK 如何处理 JVM 引导(例如设置 inouterr),最好的办法是下载 actual OpenJDK 源代码树,并深入了解它。

例如,在 Java 11 中,inouterr 的初始化发生在称为 initPhase1()System 的私有方法中。当然,你不能调用它(因为它是private),但你当然可以看看它做了什么,并在你自己的实验中复制它。但是您会看到这些变量的实际分配发生在本机代码中。

最后:

在我了解编程语言/编译器的过程中,我认为尝试编写 Java 类库的小版本可能会很酷。

我认为您最好阅读 OpenJDK 源代码。

【讨论】:

  • VG 但没有什么“虚拟”的。 GNU CLASSPATH 项目于 2012 年 3 月在 Java 1.5 中停滞不前,并且从未取得进展。 2020 年在这里甚至能找到它的遗物都令人惊讶。
  • @MarquisofLorne 互联网永远不会忘记。我已经看到一些链接到幻灯片的问题,这些幻灯片描述了 JVM/类加载器/等,在 Java 1.1/1.2 时代已经过时了……
猜你喜欢
  • 2021-04-19
  • 2017-10-20
  • 2010-12-19
  • 2015-05-28
  • 2015-09-12
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多