都说调用接口要比调用继承类要慢,但慢在何处?
先看byteCodeInterpreter.cpp里面对这invokevirtual和invokeInterface的区别。
CASE(_invokeinterface): { //调用接口
u2 index = Bytes::get_native_u2(pc+1);
ConstantPoolCacheEntry* cache = cp->entry_at(index);
methodOop callee;
klassOop iclass = (klassOop)cache->f1();
int parms = cache->parameter_size();
oop rcvr = STACK_OBJECT(-parms);
CHECK_NULL(rcvr);
instanceKlass* int2 = (instanceKlass*) rcvr->klass()->klass_part();
itableOffsetEntry* ki = (itableOffsetEntry*) int2->start_of_itable();
int i;
for ( i = 0 ; i < int2->itable_length() ; i++, ki++ ) {//搜索整个接口表,进行比较,直至找到
if (ki->interface_klass() == iclass) break;
}
.......
int mindex = cache->f2();
itableMethodEntry* im = ki->first_method_entry(rcvr->klass());
callee = im[mindex].method();//通过找到的接口,找到要调用的方法
而invokevirtual(调用继承类)
CASE(_invokevirtual):
u2 index = Bytes::get_native_u2(pc+1);
ConstantPoolCacheEntry* cache = cp->entry_at(index);
methodOop callee;
int parms = cache->parameter_size();
instanceKlass* rcvrKlass = (instanceKlass*) STACK_OBJECT(-parms)->klass()->klass_part();
callee = (methodOop) rcvrKlass->start_of_vtable()[ cache->f2()]; //直接调用方法
由上面可见,最大的区别就是接口调用每次都需要搜索接口表,而调用继承类可以直接找到。
再看看权威书籍《深入java虚拟机》P336页给出的答案,“java虚拟机使用不同于类引用的操作码来调用接口引用的方法,这是因为java不能象使用引用那样,使用许多与方法表偏移量相关的假设。对于类引用来说,无论对象实际的类是什么,方法在方法表始终占据相同的位置。但对于接口引用来说,情况就不是这样了,位于不同类的同一个方法所占据的位置是不同的,尽管这些类实现同一个接口。”
由此可知,调用接口引用方法可能要比调用类引用要慢。一般情况下,单个类实现的接口都不多,其实这方面的效率影响还是蛮小的
分享到:
相关推荐
php调用JAVA类
Java Axis 直接调用webservice 接口工具类, 无需根据wsdl编译客户端,需要axis相关包,测试使用axis 1.4, 附demo引入axis包后直接可以测试;
1,利用java调用soap接口获取天气的信息;2,利用java调用soap一个特定的案例,可按自己的要求修改。
1、封装WeatherInfo实体类,对接口返回的结果进行映射的实体类 2、WeatherUtils类,负责调用第三方天气预报api接口处理的工具类,包括根据城市查询等,返回的格式是json 3、test类,对接口进行功能性测试
C#调用Java接口演示
主要介绍了java后台调用HttpURLConnection类模拟浏览器请求实例,该实例可用于接口调用,具有一定的实用价值,需要的朋友可以参考下
java调用远程接口传输数据的demo
DELPHI 7 调用 JAVA 接口 ,传入 JAVA接口地址,和参数 返回结果
java调用HTTP接口(Get请求和Post请求)
Java调用C#接口封装和所涉及到的架包
Java 调用Http Rest接口 例子说明
java调用Gmssl中国密接口进行对称与非对称加解密等运算,动态so库进行接口jni方式调用,采取接口形式对外暴露,方便对接系统调用相关java接口进行相关运算操作。
Dubbo调用java接口程序
JAVA利用HttpClient进行HTTPS接口调用
JAVA调用WEBSERVICE接口
前段时间 做了个学校的春萌项目,其中用到vue连接后端java接口。 先上后端接口代码: package controller; import net.sf.json.JSONObject; import util.DBUtil; import javax.servlet.ServletException; import ...
java通过url调用外部接口,返回字符串,再讲字符串解析成json格式。包含源码和jar包,直接运行即可,带注释。
java代码-使用java解决webservice接口call调用方式的源代码 ——学习参考资料:仅用于个人学习使用!
HttpClient接口调用工具类 (Post请求 get请求 put请求 delete请求 下载就可以用 )
利用Jacob调用AutoCAD接口绘图,实现绘制图形,不是调用Windows绘制图形界面,是真正的调用AutoCAD绘图,只是给了测试代码,具体功能自己摸索