Java Вопрос о .class, созданном с Java 14 - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть простой класс, подобный этому.

class ClassWithDefaultConstructor{}

Я работаю с этим jdk.

C:\JavaSE14Folder>java -version
java version "14" 2020-03-17
Java(TM) SE Runtime Environment (build 14+36-1461)
Java HotSpot(TM) 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)

Как вы можете видеть, я использую последнюю версию Jdk.

Я создаю этот .class следующим образом.

C:\JavaSE14Folder>javac -d . ClassWithDefaultConstructor.java

.Class создается позже, когда я пробую эту команду.

C:\JavaSE14Folder>javap ClassWithDefaultConstructor.class

И я вижу следующее

Compiled from "ClassWithDefaultConstructor.java"
class ClassWithDefaultConstructor {
   ClassWithDefaultConstructor();
}

Вначале меня радуют две вещи: сначала создается конструктор по умолчанию, и я вижу, что видимость конструктора такая же, как у классного, но это здорово, но 3 вещи вызывают уныние: (

Мои вопросы.

1). Why the constructor has no body and terminates with ;
2). Why the constructor hasn't a call to the java.lang.Object constructor?;
3). Why this class is not extending java.lang.Object

Я ожидал чего-то подобного.

class ClassWithDefaultConstructor extends java.lang.Object {
   ClassWithDefaultConstructor(){
       super();
   }
}

Я ожидал байт-код примерно как этот пост.

Post

Возможно, я что-то пропустил, пожалуйста, будьте добры.

:) С наилучшими пожеланиями из Венесуэлы.

Если я поставлю такую ​​команду.

C:\JavaSE14Folder>javap -c ClassWithDefaultConstructor.class
Compiled from "ClassWithDefaultConstructor.java"
class ClassWithDefaultConstructor {
 ClassWithDefaultConstructor();
 Code:
   0: aload_0
   1: invokespecial #1                  // Method java/lang/Object." 
<init>":
()V
   4: return
}

отличается, но все же я не вижу своих вещей, таких как расширение Object и т. Д.

Я бы хотел увидеть что-то подобное по крайней мере как в посте.

Compiled from "test.java"
public class test extends java.lang.Object{

В резюме я не вижу компилятора, вставляющего эти неявные строки.

В этом Java Вопрос о .class, сгенерированном с помощью Java 14 утверждает, что то же самое происходит в более новых версиях Java.

Тот же вывод с использованием

C:\Program Files\Java\jdk1.8.0_121\bin

1 Ответ

2 голосов
/ 02 апреля 2020

Байт-код! = Java исходный код.

Что такое на самом деле в файле класса - это просто случайные байты. То, что вы видите, - это текстовое представление javap байт-кода, которое предназначено для знакомства Java программистам, которые мало знают о байт-коде, и, следовательно, использует Java подобный синтаксис, где это возможно. Но это не так и не должно быть фактическим исходным кодом Java.

Если бы вы использовали другой дизассемблер, такой как Krakatau , выходные данные выглядели бы совсем иначе, но все равно быть представлением того же двоичного файла классов.

...