invoke-super <interface method =“”> vs invoke-interface <interface method =“”>?

时间:2018-04-16 17:23:37

标签: dalvik smali

在Dex版本037 +中,invoke-super midinvoke-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

1 个答案:

答案 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()VLmy/superinterface;
  • 调用实施
  • invoke-super {v0}, Lmy/subclass;->someMethod()VLmy/superclass;
  • 调用实施
  • invoke-virtual {v0}, Lmy/subclass;->someMethod()VLmy/subclass;
  • 调用实施