在Dex版本037 +中,invoke-super mid
和invoke-interface mid
之间的行为有何区别mid
是接口方法?
我引用了Dalvik文档[1]中的以下内容,但我无法理解它:
在Dex文件版本037或更高版本中,如果method_id引用了 接口方法,
invoke-super
用于调用最具体的, 在该接口上定义的该方法的非重写版本。该 与invoke-virtual相同的方法限制。在Dex文件中 在版本037之前,具有接口method_id是非法的 未定义。
invoke-interface
用于调用接口方法,即on 使用引用的method_id的具体类未知的对象 到界面。
[1] https://source.android.com/devices/tech/dalvik/dalvik-bytecode
答案 0 :(得分:1)
Dex版本37增加了对默认接口方法的支持。因此,如果使用Lmy/interface;->someMethod()V
之类的函数调用invoke-super,它将搜索接口层次结构以查找提供该接口实现的第一个接口。
所以,更完整的例子,假设我们有一些课程。
Lmy/superinterface;
Lmy/interface;
扩展了Lmy/superinterface;
Lmy/superclass;
的Lmy/interface;
Lmy/subclass;
扩展了Lmy/superclass;
我们假设Lmy/superinterface;
定义了someMethod()V
的默认实现,Lmy/superclass;
和Lmy/subclass;
都提供了自己的实现
如果v0中有Lmy/subclass;
的对象,那么
invoke-super {v0}, Lmy/interface;->someMethod()V
从Lmy/superinterface;
invoke-super {v0}, Lmy/subclass;->someMethod()V
从Lmy/superclass;
invoke-virtual {v0}, Lmy/subclass;->someMethod()V
从Lmy/subclass;