#java #jvm #class-library
#java #jvm #библиотека классов
Вопрос:
В моем путешествии к пониманию языков программирования / компиляторов я подумал, что было бы здорово попробовать написать небольшие версии библиотеки классов 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. public static final
Переменная ‘out’, содержащаяся внутри Java.lang.System
, не создается так, как это обычно делают объекты с ключевым словом new. Я попытался имитировать то, как это было сделано, и написал приведенный выше код соответствующим образом.
Я понял VMSystem
, что в библиотеке классов есть еще один класс, у которого есть статический метод makeStandardOutputStream()
, который возвращает PrintStream
объект.
Это было бы хорошо, за исключением того, что компилятор (или, может быть, eclipse?) Не распознает VMSystem, и когда я попытался импортировать пакеты, которые я нашел в OpenJDK, они также не распознаются.
Код, на который я ссылаюсь, находится по адресу: http://developer.classpath.org/doc/java/lang/System-source.html
Итак, в основном я пытаюсь выяснить, как использовать методы VMSystem. Может быть, мне нужно загрузить пакет? На самом деле это не имеет смысла. Поскольку System.out.println()
работает, то пакетов там уже должно быть нет? Или, возможно, это проблема с разрешениями / безопасностью?
Спасибо!
Комментарии:
1. Поля
System
ввода-вывода имеют специальные свойства в JLS, которые применяются только к ним . В целом обратите внимание, что внутренний код, который является частью самой JVM, напримерVMSystem
, может быть изменен в любое время и часто по необходимости использует очень странные (с точки зрения Java) методы для обеспечения платформы JVM.
Ответ №1:
VMSystem
Класс является внутренним классом в (старой, практически несуществующей) реализации GNU ClassPath библиотек классов Java SE.
Он не является частью Java API, и в OpenJDK нет его эквивалента; т. Е. Методы, которые вы ищете, могут не существовать.
С другой стороны … если вы хотите понять, как OpenJDK обрабатывает загрузку JVM ( in
out
например, настройку err
и т. Д.), Лучше всего загрузить фактическое дерево исходных текстов OpenJDK и глубоко погрузиться в него.
Например, в Java 11 инициализация in
out
и err
происходит в частном методе System
вызываемого initPhase1()
. Естественно, вы не можете вызвать его (потому что это так private
), но вы, безусловно, можете посмотреть, что он делает, и повторить это в своем собственном эксперименте. Но вы увидите, что фактическое присвоение этих переменных происходит в машинном коде.
Наконец:
В моем путешествии к пониманию языков программирования / компиляторов я подумал, что было бы здорово попробовать написать небольшие версии библиотеки классов Java.
Я думаю, вам было бы лучше просто прочитать исходный код OpenJDK.
Комментарии:
1. VG но в этом нет ничего «виртуального». Проект GNU CLASSPATH застопорился в марте 2012 года на Java 1.5 и никогда не продвигался. Удивительно найти здесь даже остатки этого в 2020 году.
2. @MarquisofLorne Интернет никогда не забывает. Я видел несколько вопросов, связанных со слайдами, которые описывали JVM / загрузчики классов / etc таким образом, который устарел в Java 1.1 / 1.2 раз…