JVM命令-instanceof

  instanceof是Java反射编程中经常用到的关键字。instanceof关键字作用是验证一个Java实例是否属于某个特定的类或者接口。
参考文档

JVM规范

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.instanceof

操作

决定对象是否是给定类型

指令格式

instanceof
indexbyte1
indexbyte2

操作栈

…, objectref →

…, result

描述

  objectref必须是类型引用(从操作栈中弹出)。无符号字节indexbyte1和indexbyte2用来构造一个指向运行时常量池索引,这个索引值为(indexbyte1 << 8) | indexbyte2,也就是两个数字拼接。索引指向常量池中的对象一定是一个类、数组或者接口类型的引用。
  如果objectref为null,instanceof指令推送一个整数0进入操作栈。
  除此之外,如果objectref是一个已经给定的类、数组或者接口实现,将放置一个整数1到操作数栈,否则放置0。
下面将要介绍确定一个非null得objectref是给定类型的实例。假设S是objectref所属的类,T是指定类、数组或者接口类型,下面是判断规则:

  • 如果S是一个普通类/非数组的类,则:

    • 如果类型T是一个普通类类型,S必须和T的类型相同或者S必须是T的子类型
    • 如果T是一个接口类型,对象S必须实现接口T
  • 如果S是一个接口类型,则:

    • 如果T是一个普通类类型,则T必须是Object类型。
    • 如果T是一个接口类型,则T必须S实现了相同接口,或者S实现T的父接口
  • 如果S属于数组类型SC[],S是一个SC类型的组件,则

    • 如果T是普通类类型,则T必须是Object类型。
    • 如果T是接口类型,然后T必须是通过数组实现的接口之一
    • 如果T是一个数据类型TC[],是TC类型数组的组件,则必须符合下面中的一个:
      • TC和SC是相同的原始类型
      • TC和SC是相容的引用类型,并且在运行时规则下,类型SC能够映射为TC