instanceof

操作:

 决定对象是否是指定类型的实例

指令格式:

    instanceof
    indexbyte1
    indexbyte2

指令码:

    instanceof = 193 (0xc1)
    

指令执行前后的栈顶状态:

    ..., objectref →
    
    ..., result

描述:

objectref是线程栈顶部弹出的类型的引用,无符号数indexbyte1和indexbyte2共同构建成一个索引(indexbyte1<<8|indexbyte2)指向运行时常量池中的类.
如果objectref为null,result=0;
如果objectref为指定类(resolved class),数组,接口的实例,则result=1
否则result=0;

举例说明:

如果S是objectref所指向的类,T为指定类(resolved class),在下列情况下result=1:

  • 如果S是一个class:

    • 如果T为class,则S extends T,或者S等于T
    • 如果T为interface,则S implements T
  • 如果S是一个class:

    • 如果T为interface,则T为Object
    • 如果T为interface,则S extends T,或者S等于T
  • 如果S是一个array,SC[],数组元素为SC:

    • 如果T为class,则T为Object
    • 如果T为interface,则T 为数组的子类(见JLS4.10.3)
    • 如果T是一个array,TC[],数组元素为TC

      • TC和SC是相同的原始类型
      • TC和SC都是class,SC可以在运行时转换为TC

JVM具体的实现

论文Fast subtype checking in the HotSpot JVM
问答请教一个share/vm/oops下的代码做fast subtype check的问题

参考:
1.JLS
2.JVM
3.知乎


mumubin
375 声望185 粉丝