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

吉米(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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如果我在已删除的实体上调用EF Reload,会发生什么情况?

来自分类Dev

如果仅在类中重写hashCode()并在Set中使用它,会发生什么情况?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

使用类函数更改S4对象的“类”时会发生什么情况?

来自分类Dev

如果方法A调用方法B并且都具有[Transaction]属性,会发生什么情况?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

iOS:当我从其他类调用重写的方法时,会发生什么情况

来自分类Dev

当我将unpack()作为lua的函数参数调用时,会发生什么情况?

来自分类Dev

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

来自分类Dev

如果不将字体嵌入Flash,会发生什么情况?

来自分类Dev

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

来自分类Dev

如果不关闭Docker容器,会发生什么情况?

来自分类Dev

如果在我的java文件中使用了很多@SuppressWarnings,会发生什么情况?

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

    如果我在已删除的实体上调用EF Reload,会发生什么情况?

  4. 4

    如果仅在类中重写hashCode()并在Set中使用它,会发生什么情况?

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

    使用类函数更改S4对象的“类”时会发生什么情况?

  17. 17

    如果方法A调用方法B并且都具有[Transaction]属性,会发生什么情况?

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

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

  22. 22

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

  23. 23

    iOS:当我从其他类调用重写的方法时,会发生什么情况

  24. 24

    当我将unpack()作为lua的函数参数调用时,会发生什么情况?

  25. 25

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

  26. 26

    如果不将字体嵌入Flash,会发生什么情况?

  27. 27

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

  28. 28

    如果不关闭Docker容器,会发生什么情况?

  29. 29

    如果在我的java文件中使用了很多@SuppressWarnings,会发生什么情况?

热门标签

归档