https://www.zhihu.com/question/21574535/answer/18998914

Java instanceof 关键字是如何实现的?

基本理解

只是在同一个类加载器加载的前提下,使用其生成的对象,去比较才有意义。不同的类加载器加载的类生成对象,互相instanceof返回false。

HotSpot VM具体使用了长度为8的缓存数组,记录某个类从继承深度0到7的超类。HotSpot把类继承深度在7以内的超类叫做“主要超类型”(primary super),把所有其它超类型(接口、数组相关以及超过深度7的超类)叫做“次要超类型”(secondary super)。
对“主要超类型”的子类型判断不需要像Kaffe或JamVM那样沿着super链做遍历,而是直接就能判断子类型关系是否成立。这样,类的继承深度对HotSpot VM做子类型判断的性能影响就变得很小了。
对“次要超类型”,则是让每个类型把自己的“次要超类型”混在一起记录在一个数组里,要检查的时候就线性遍历这个数组。留意到这里把接口类型、数组类型之类的子类型关系都直接记录在同一个数组里了,只要在最初初始化secondary_supers数组时就分情况填好了,而不用像Kaffe、JamVM那样每次做instanceof运算时都分开处理这些情况。

举例来说,如果有下述类继承关系:
Apple <: Fruit <: Plant <: Object
并且以Object为继承深度0,那么对于Apple类来说,它的主要超类型就有:
0: Object
1: Plant
2: Fruit
3: Apple
这个信息就直接记录在Apple类的primary_supers数组里了。Fruit、Plant等类同理。

如果我们有这样的代码:

  1. Object f = new Apple();
  2. boolean result = f instanceof Plant;

也就是变量f实际指向一个Apple实例,而我们要问这个对象是否是Plant的实例。
可以知道f的实际类型是Apple;要测试的Plant类的继承深度是1,拿Apple类里继承深度为1的主要超类型来看是Plant,马上就能得出结论是true。
这样就不需要顺着Apple的继承链遍历过去一个个去看是否跟Plant相等了。

 

字节码

instanceof indexbyte1 indexbyte2
执行时,objectref出栈, indexbyte1 indexbyte2构建一个指向当前类运行时常量池的索引值。 为一个类、接口、数组类型的符号引用
如果objectref为null,那么instanceof指令将int 0推入栈
如果objectref可以转换为这个类,则1入栈,否则0入栈

最新文章

  1. swift 可选类型(optional)--- swift 入门
  2. javascript中的冒泡排序
  3. .Net模拟提交表单
  4. 将long数字序列化为json时,转换为字符串
  5. 安装java后的环境变量配置
  6. eclipse从数据库逆向生成Hibernate实体类
  7. 63. Unique Paths II
  8. Zxing 扫二维码
  9. Ubuntu解决Sublime Text 2安装GBK Encoding Support插件仍然乱码
  10. hibernate初探
  11. AutoMapper使用说明
  12. require.js 源码解读——配置默认上下文
  13. 嵌入式Llinux学习路线图
  14. Android优化之ArrayMap
  15. Windows -- cmd命令: ipconfig 和 nbtstat
  16. line-height与height
  17. PHP中的Session工作原理
  18. GitHub Desktop 出现“please upgrade your plan to create a new private repository”的解决办法
  19. echarts tooltip巧用
  20. PHP-CPP开发扩展(二)

热门文章

  1. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_7.RabbitMQ研究-工作模式-工作队列模式
  2. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_15-页面静态化-模板管理-模板管理业务流程
  3. JAVA 基础编程练习题29 【程序 29 求矩阵对角线之和】
  4. ProbCog mlnlearn的探索
  5. word内存不足 解决办法
  6. Spring Security(01)——初体验
  7. 【ABAP系列】SAP ABAP 高级业务应用程序编程(ABAP)
  8. 【miscellaneous】如何利用硬盘号和CPU序列号为软件加密
  9. 【DSP开发】CCS数据格式 load
  10. Django--Form组件使用出现的小bug记录--username拿到None