在Dex版本的037+中,invoke-super mid
和invoke-interface mid
之间的行为有什么不同,其中mid
是接口方法?
我引用了Dalvik docs 1中的以下内容,但我无法理解它:
在Dex文件版本037或更高版本中,如果method_id引用接口方法,则使用
invoke-super
调用在该接口上定义的该方法的最特定、非重写版本。同样的方法限制也适用于调用-虚拟。在版本037之前的Dex文件中,拥有一个接口method_id是非法的,也是未定义的。invoke-interface
使用引用接口的method_id调用接口方法,即对具体类未知的对象调用接口方法。
发布于 2018-04-16 17:50:49
Dex版本37增加了对默认接口方法的支持。因此,如果您使用类似于Lmy/interface;->someMethod()V
的东西调用invoke-超级,它将在接口层次结构中搜索,以找到提供该接口实现的第一个接口。
因此,对于一个更完整的例子,假设我们有几个类。
Lmy/superinterface;
Lmy/interface;
的Lmy/superinterface;
Lmy/superclass;
的Lmy/interface;
Lmy/subclass;
的Lmy/superclass;
假设Lmy/superinterface;
定义了someMethod()V
的默认实现,Lmy/superclass;
和Lmy/subclass;
都提供了自己的实现
如果在Lmy/subclass;
中有一个v0对象,那么
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;
调用实现https://stackoverflow.com/questions/49863005
复制相似问题