instanceof解析
2024-09-01 13:32:07
https://www.zhihu.com/question/21574535/answer/18998914
基本理解
只是在同一个类加载器加载的前提下,使用其生成的对象,去比较才有意义。不同的类加载器加载的类生成对象,互相instanceof返回false。
HotSpot VM具体使用了长度为8的缓存数组,记录某个类从继承深度0到7的超类。HotSpot把类继承深度在7以内的超类叫做“主要超类型”(primary super),把所有其它超类型(接口、数组相关以及超过深度7的超类)叫做“次要超类型”(secondary super)。
对“主要超类型”的子类型判断不需要像Kaffe或JamVM那样沿着super链做遍历,而是直接就能判断子类型关系是否成立。这样,类的继承深度对HotSpot VM做子类型判断的性能影响就变得很小了。
对“次要超类型”,则是让每个类型把自己的“次要超类型”混在一起记录在一个数组里,要检查的时候就线性遍历这个数组。留意到这里把接口类型、数组类型之类的子类型关系都直接记录在同一个数组里了,只要在最初初始化secondary_supers数组时就分情况填好了,而不用像Kaffe、JamVM那样每次做instanceof运算时都分开处理这些情况。
对“主要超类型”的子类型判断不需要像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等类同理。
如果我们有这样的代码:
- Object f = new Apple();
- 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入栈
最新文章
- swift 可选类型(optional)--- swift 入门
- javascript中的冒泡排序
- .Net模拟提交表单
- 将long数字序列化为json时,转换为字符串
- 安装java后的环境变量配置
- eclipse从数据库逆向生成Hibernate实体类
- 63. Unique Paths II
- Zxing 扫二维码
- Ubuntu解决Sublime Text 2安装GBK Encoding Support插件仍然乱码
- hibernate初探
- AutoMapper使用说明
- require.js 源码解读——配置默认上下文
- 嵌入式Llinux学习路线图
- Android优化之ArrayMap
- Windows -- cmd命令: ipconfig 和 nbtstat
- line-height与height
- PHP中的Session工作原理
- GitHub Desktop 出现“please upgrade your plan to create a new private repository”的解决办法
- echarts tooltip巧用
- PHP-CPP开发扩展(二)
热门文章
- 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_7.RabbitMQ研究-工作模式-工作队列模式
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_15-页面静态化-模板管理-模板管理业务流程
- JAVA 基础编程练习题29 【程序 29 求矩阵对角线之和】
- ProbCog mlnlearn的探索
- word内存不足 解决办法
- Spring Security(01)——初体验
- 【ABAP系列】SAP ABAP 高级业务应用程序编程(ABAP)
- 【miscellaneous】如何利用硬盘号和CPU序列号为软件加密
- 【DSP开发】CCS数据格式 load
- Django--Form组件使用出现的小bug记录--username拿到None