.smali invoke-virtual&调用超

时间:2014-05-07 15:03:15

标签: java android smali

我正在尝试基于.smali文件生成调用图。但是,我遇到了一个令人困惑的案例如下:

.super Landroid/graphics/drawable/Drawable;
.source "SBarExp.java"

.method public final setBounds(Landroid/graphics/Rect;)V
  .line 514
  iget-object v2, p0, Lcom/sds/android/ttpod/app/modules/skin/view/SeekBarExpansion$a;->b:Landroid/graphics/drawable/Drawable;
  invoke-virtual {v2, p1, v0, p3, v1}, Landroid/graphics/drawable/Drawable;->setBounds(IIII)V
  .line 515
  invoke-super {p0, p1, v0, p3, v1}, Landroid/graphics/drawable/Drawable;->setBounds(IIII)V
.end method

根据我的理解,“invoke-super”只是意味着它将调用父方法,因此“invoke-super {p0,p1,v0,p3,v1},Landroid / graphics / drawable / Drawable; - > setBounds(IIII)V“可以解释为 ? “Landroid /图形/抽拉/绘制对象; - >的setBounds(IIII)V”

如果是,我想知道“invoke-virtual {v2,p1,v0,p3,v1},Landroid / graphics / drawable / Drawable; - > setBounds(IIII)V”是否与“ invoke-super {p0,p1,v0,p3,v1},Landroid / graphics / drawable / Drawable; - > setBounds(IIII)V“?

如果不是,有什么区别?如果是,为什么它两次调用相同的方法(使用不同的方式)?

请帮助,非常感谢!

1 个答案:

答案 0 :(得分:2)

invoke-virtual使用与目标对象的类关联的vtable(即第一个参数的实际运行时类型)执行虚拟表查找。

然而,invoke-super略有不同。它使用包含正在执行的方法的类的超类来执行vtable查找。特别要注意的是,vtable查找不使用或取决于目标对象的运行时类型。

在您的示例中,将在

的结果上调用invoke-virtual指令
iget-object v2, p0, Lcom/sds/android/ttpod/app/modules/skin/view/SeekBarExpansion$a;->b:Landroid/graphics/drawable/Drawable;

此时,调用的实际方法取决于v2的实际类型,它可以是Drawable的任何子类。

在p0寄存器上调用invoke-super指令,该寄存器可能包含" this"当前对象的引用。但是,p0的运行时类型实际上并不重要。无论p0的运行时类型如何,invoke-super指令总是会调用Drawable的setBounds实现。