相关疑难解决方法(0)

调用接口有什么意义?

我正在阅读这篇关于JVM如何调用方法的文章,我想我已经掌握了大部分内容.但是,我仍然无法理解需要invokeinterface.

我理解它的方式,一个类基本上有一个方法的虚拟表,当调用一个方法时,invokevirtualinvokeinterface咨询这个虚拟表.

那么,在接口上定义的方法和在基类上定义的方法之间有什么区别?为什么不同的字节码?

的指令描述看起来也非常相似.

该文章似乎声称,每次调用方法时,接口的方法表都可以具有"不同的偏移量".我不明白的是为什么接口会有一个方法表,因为没有对象可以将接口作为其实际类型.

我错过了什么?

jvm

65
推荐指数
1
解决办法
9341
查看次数

变量'final'修饰符在字节码中丢失了?

分析这个简单类的字节码,我得出的结论是编译器不保留有关局部变量的任何信息final.这看起来很奇怪,因为我相信HotSpot编译器实际上可以使用这些信息来进行优化.

代码:

public static void main(String[] args)
{
    final int i = 10;
    System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)

字节码:

public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
  stack=2, locals=2, args_size=1
     0: bipush        10
     2: istore_1      
     3: getstatic     #16                 // Field java/lang/System.out:Ljava/io/PrintStream;
     6: bipush        10
     8: invokevirtual #22                 // Method java/io/PrintStream.println:(I)V
    11: return        
  LineNumberTable:
    line 7: 0
    line 8: 3
    line 9: 11
  LocalVariableTable:
    Start  Length  Slot  Name   Signature
        0      12     0  args   [Ljava/lang/String;
        3       9     1     i …
Run Code Online (Sandbox Code Playgroud)

java jvm final jvm-bytecode

7
推荐指数
1
解决办法
371
查看次数

如何判断一个局部变量是否来自Java字节码的"最终"?(与BCEL相关)

信息,例如局部变量是否"最终"存储在Java字节码中?我知道对于字段(全局变量)和方法,这些在访问标志位中找到,但似乎无法在局部变量表中找到等效项.

我对这个问题很感兴趣,因为我正在使用BCEL来检查局部变量是否是最终的,并且已经找到了AccessFlags类中的字段,方法和类的等价物.

提前致谢.

java bytecode bcel

5
推荐指数
1
解决办法
517
查看次数

标签 统计

java ×2

jvm ×2

bcel ×1

bytecode ×1

final ×1

jvm-bytecode ×1