如果从类文件中删除超级构造函数调用,会发生什么情况?

吉米(Jimmy T.)

当构造函数没有对父类构造函数的显式调用时,this()编译器将插入super()

如果从类文件中删除了此调用(编译后),会发生什么情况?

吉米(Jimmy T.)

我自己尝试过的。

class Test
{
    public Test()
    {
        System.out.println("Hello World");
    }

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

我对其进行了编译,并invokespecial java/lang/Object/<init>()V使用类文件编辑器将其从构造函数中删除

看来JVM拒绝加载该类:

Exception in thread "main" java.lang.VerifyError: Operand stack overflow
Exception Details:
  Location:
    Test.<init>()V @4: ldc
  Reason:
    Exceeded max stack size.
  Current Frame:
    bci: @4
    flags: { flagThisUninit }
    locals: { uninitializedThis }
    stack: { uninitializedThis, 'java/io/PrintStream' }
  Bytecode:
    0000000: 2ab2 0002 1203 b600 04b1

        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

我仍然不知道这是否是定义好的行为。

编辑

根据Raedwald的说法,我还必须更改堆栈操作。

因此,我还删除aload_0了超级构造函数调用之前的代码。

现在,我得到以下异常:

Exception in thread "main" java.lang.VerifyError: Constructor must call super()
or this() before return
    Exception Details:
  Location:
    org/exolin/geno/Test.<init>()V @8: return
  Reason:
    Error exists in the bytecode
  Bytecode:
    0000000: b200 0212 03b6 0004 b1

        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

这让我感到好奇,所以我将构造函数的指令重新排序为:

getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "Message"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
aload_0
invokespecial java/lang/Object/<init>()V
return

哪个有效!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果我不在扩展类中调用可选的超级方法或构造函数,会发生什么情况?

如果子类未在Java中定义构造函数,会发生什么情况?

如果我使用JNI从C的多个线程中调用Java函数,会发生什么情况?

如果在匿名子程序中调用shift,会发生什么情况?

如果未在lambda函数中取消超时处理程序,会发生什么情况?

在Git中删除分支时会发生什么情况

如果Linux中的单个目录下文件过多,会发生什么情况?

虚拟析构函数,如果在派生类中没有析构函数,会发生什么情况?

如果某些程序正在从一个文件中读取数据时删除输入文件,将会发生什么情况?

如果调用析构函数并将分配的内存再次用于其他对象,会发生什么情况?

如果您在接收块的末尾不再次调用该函数,会发生什么情况?-Erlang

如果同一文件中有2个Appdelegate类,将会发生什么情况

当传递引用参数存储在被调用方对象中,然后被调用方删除时,会发生什么情况?

如果我们在Java多线程中的executorService执行调用中传递线程,会发生什么情况

如果onPause()或onStop()使用Firebase数据库中的嵌套回调中断函数,会发生什么情况

当类构造函数调用 setter 时会发生什么

如果我在Git中假定未更改的早期文件集上进行更改,会发生什么情况?

如果在推送过程中忽略./.git/objects/pack/下的.pack文件,会发生什么情况?

如果在取消点上调用信号处理程序,会发生什么情况?

如果在ajax调用期间显示警报窗口,会发生什么情况?

如果我不为JobService调用jobFinished,会发生什么情况?

如果我在pyspark中将类方法用作udf,会发生什么情况?

如果我合并删除了我新功能的代码的提交,会发生什么情况?

如果我从GitHub帐户删除GPG密钥,会发生什么情况?

如果通过lambda函数对象返回对局部变量的引用,会发生什么情况?

如果我在PHP函数的末尾不包含“ return”,会发生什么情况?

如果将很少的参数传递给Shell函数,会发生什么情况?

Matlab OOP:当在数组属性上调用get函数时,会发生什么情况?

如果rm在提示中途停止,会发生什么情况?