反编译后无法在.class文件中看到Super()

时间:2014-07-13 12:03:00

标签: java decompiling .class-file

 class p {
     p(){
         System.out.println("1");
     }
 }
class Student extends p{  
    Student() {
        super();
        System.out.println("2");
    }

    public static void main(String[] args) {
        Student s =  new Student();
    }
}

由于我已经明确地提供了super(),但在使用jd-gui进行反编译之后,我无法看到我放置的super(),因为super()应该由编译器本身提供。我只是想看看这个,super关键字和其他东西是由编译器隐式提供的。我用Google搜索并发现.class文件我可以用jd-gui看到,但是我无法看到super()和this(),有没有其他相同的方法? image

2 个答案:

答案 0 :(得分:6)

在Java中,任何不以明确的super(...)this(...)链接构造函数调用开头的构造函数都将自动获取(等效的字节码)super();作为其第一条指令插入编译器。因此,当反编译器在构造函数的开头看到super()的字节码时,它无法知道原始源代码是否包含显式super()或者指令是否是由编译器隐式插入的。两个版本都编译为相同的字节码,因此没有特别的理由让它更喜欢一个字节码。

答案 1 :(得分:1)

无论如何,在反编译代码中都​​会调用隐式构造函数super()

Class A extends B {
    public A() {
        super(); // this is called whether you put it here or not
    }
}