关于使用 Java 14 生成的 .class 的 Java 问题

标签 java bytecode

我有一个像这样的简单类(class):

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();
}

这里有两件事让我很高兴;首先创建默认构造函数,我看到构造函数的可见性与类相同,但有三件事让人感到悲伤。

我的问题是:

  1. 为什么构造函数没有主体并以 ; 终止?
  2. 为什么构造函数没有调用 java.lang.Object 构造函数?
  3. 为什么这个类没有扩展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
}

是不同的,但我仍然没有看到我的东西,比如扩展对象等等。

我希望看到这样的东西,至少像在帖子中一样:

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

总之,我没有看到编译器插入这些隐式行。

在此Java Question about a .class generated with Java 14声明在较新版本的 Java 上也会发生同样的情况。

使用相同的输出:

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

最佳答案

字节码!= Java 源代码。

类文件中的实际上只是随机字节。您所看到的是 javap 字节码的文本表示形式,它旨在让不太了解字节码的 Java 程序员熟悉,因此尽可能使用类似 Java 的语法。但它不是、也不意味着是实际的 Java 源代码。

如果您使用不同的反汇编程序,例如 Krakatau ,输出看起来会非常不同,但它仍然是同一二进制类文件的表示。

关于关于使用 Java 14 生成的 .class 的 Java 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60981074/

相关文章:

java - 使用 Java var 关键字的缺点

java - 使用子域的负载平衡/TCP 端口转发

java - 尝试从 JComponent 调用函数时传递按钮时出现 MVC 函数错误

java - Eclipse 启用注释处理导致错误

使用字节码进行 Java 调试

Lua 字节码到 Lua 人类 "readable"

java - 将 Set<T> 转换为 List<T> 的最简洁方法

java - 使用java从odt文件读取XForm

java - 为什么 javac 有时会创建不必要的变量副本?

java - ASM 从堆栈帧中获取精确值