java – 在向下转换时在不同级别中转换性能

让我们假设我们有三个(或更多)类

公共课A {}

公共B级扩展A {}

公共类C扩展B实现G {}

假设每个类都有自己的20个(或更多)方法.

铸造到C与铸造到A对性能有更大的影响吗? Java编译如何在幕后工作?

在向下投射时,是否必须通过反射检查所有方法和字段是否存在?

编辑:
类的大小(字段和方法数量)是否会影响投射时的性能
我对OpenJRE和Dalvik感兴趣.

作为参考,我知道可以毫无问题地完成向上转换.

最佳答案
转换的性能取决于JVM的实现.

JLS 5.5仅确定转换的要求(包括递归算法),但不对实现设置任何要求.实际上runtime cast rules in 5.5.3也是以同样的方式确定的.产生与提出的算法相同结果的所有JVM实现都被接受为适当的JVM.

通常,由于JVM必须检查对象的运行时类型,因此向下转换为C会花费更多时间.当转换为A时,它没有理由进行相同的检查,因为B扩展为A.

实际上,JVM并不关心方法和字段的数量.它只比较类型层次结构,你可以用反射检查它(o.getClass())

我做了如下示例代码,一个是downcast,另一个是upcast:

Object o = new Integer(1);
Integer i = (Integer) o;

Object o2 = i;

编译后的字节码如下:

 0  new java.lang.Integer [16]
 3  dup
 4  iconst_1       <-- 1 as a parameter to the constructor
 5  invokespecial java.lang.Integer(int) [18]   <-- constructor
 8  astore_1 [o]       <-- store in 'o'
 9  aload_1 [o]
10  checkcast java.lang.Integer [16]    <-- DOWNCAST CHECK,SPECIAL BYTECODE
13  astore_2 [i]
14  aload_2 [i]
15  astore_3 [o2]   <-- WITH UPCAST NO CHECK

因此,有一个特定的JVM指令,它使用给定的类检查堆栈顶部的元素.

有了向上,根本没有检查.

类的大小(字段数,方法,实际占用空间)无关紧要,因为转换会检查类(元数据,实际上是对象).

层次结构级别的数量以及实现的接口(如果转换为接口)的数量确实很重要,因为这是要检查的可遍历继承/实现树.

如果没有这种检查的某种缓存,我会感到惊讶.

相关文章

以下为个人理解,如错请评 CE: 凭据加密 (CE) 存储空间, 实际路径/data/user_ce/ DE: 设备加密 (DE) 存...
转载来源:https://blog.csdn.net/yfbdxz/article/details/114702144 用EventLog.writeEvent打的日志(或...
事件分发机制详解 一、基础知识介绍 1、经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION...
又是好久没有写博客了,一直都比较忙,最近终于有时间沉淀和整理一下最近学到和解决的一些问题。 最近进...
Android性能优化——之控件的优化 前面讲了图像的优化,接下来分享一下控件的性能优化,这里主要是面向...
android的开源库是用来在android上显示gif图片的。我在网上查了一下,大家说这个框架写的不错,加载大的...