相关疑难解决方法(0)

为什么this()和super()必须是构造函数中的第一个语句?

Java要求如果在构造函数中调用this()或super(),它必须是第一个语句.为什么?

例如:

public class MyClass {
    public MyClass(int x) {}
}

public class MySubClass extends MyClass {
    public MySubClass(int a, int b) {
        int c = a + b;
        super(c);  // COMPILE ERROR
    }
}
Run Code Online (Sandbox Code Playgroud)

Sun编译器说"调用super必须是构造函数中的第一个语句".Eclipse编译器说"构造函数调用必须是构造函数中的第一个语句".

但是,您可以通过重新安排代码来解决这个问题:

public class MySubClass extends MyClass {
    public MySubClass(int a, int b) {
        super(a + b);  // OK
    }
}
Run Code Online (Sandbox Code Playgroud)

这是另一个例子:

public class MyClass {
    public MyClass(List list) {}
}

public class MySubClassA extends MyClass {
    public MySubClassA(Object item) {
        // Create a list …
Run Code Online (Sandbox Code Playgroud)

java constructor

572
推荐指数
8
解决办法
21万
查看次数

在字节码中确定哪里是super()方法调用,所有构造函数必须在JVM上执行

我想知道在分析构造函数的字节码时是否有一种明显而快速的方法,以确定super()代码的结束位置.

更具体地说,与Java形成鲜明对比的是,构造函数中对任何super()构造函数方法的调用是可选的(或者更确切地说,当不存在时 - 隐式),在字节码世界中始终需要它.

出于黑魔法的目的,我需要通过字节码分析和最简单的方法来了解INVOKESPECIAL,与Java世界的super()调用相对应的调用是什么.

我会带着一个很难的例子离开这里:

public static class A {
    public A(Object o, Object b) {
    }
}

public static class B extends A {
    public B() {
        //the below super is in bold just to signal that's the one
        //I'm looking for
        SUPER(new A(new Object(), new Integer(2)), new Integer(1));
        System.out.println(new A(new Object(), new Integer(2)));
    }
}
Run Code Online (Sandbox Code Playgroud)

使用相应的字节码: 在此输入图像描述

java bytecode

8
推荐指数
1
解决办法
1653
查看次数

标签 统计

java ×2

bytecode ×1

constructor ×1