【问题标题】:How to ckeck Java Internal code which is written by Java Complire implicitly如何检查Java编译器隐式编写的Java内部代码
【发布时间】:2021-12-03 03:00:32
【问题描述】:

人们说 Java 中有一些代码是强制性的,即使程序员没有编写它们。 Java 编译器自己隐式编写。

就像我的代码是这样的

class Test {

    public static void main(String args[]) {
        Test obj = new Test();
    }
}

这里我没有写默认构造函数,也就是说Java编译器会自己隐式写出来的。

这意味着我的 Test.class 文件中有一个默认构造函数。

如果我反编译我的 Test.class 文件,它应该看起来像这样

class Test {

    Test() {
        super();
    }

    public static void main(String args[]) {
        Test obj = new Test();
    }
}

为什么我反编译的时候java文件中没有显示任何默认构造函数?

【问题讨论】:

  • 反编译器并不是学习编译器功能的完美工具,因为它们知道并对其中一些隐含的决定做出反应。如果您想知道 Java 编译器究竟做了什么,您应该熟悉 javap 命令的输出,它在相当低的级别向您显示 .class 文件究竟包含什么(尤其是使用 -v 调用时)。

标签: java internals compiled-language


【解决方案1】:

您的反编译器可能不一定显示默认 ctor,因为它知道它的隐含性。这是该编译器的实现者的设计决定,并且可以通过某些设置进行配置。

但是,它显然是以字节码的形式存在的——编译以下 java 代码:

class A {}

然后用javap -c A.class 反汇编它会显示一个默认构造函数:

Compiled from "A.java"
class A {
  A();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
}

当然,它只是加载this,将其压入堆栈,然后调用无参数超类ctor。

【讨论】:

    猜你喜欢
    • 2021-09-22
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 2021-06-14
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多