我正在尝试基于.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“?
如果不是,有什么区别?如果是,为什么它两次调用相同的方法(使用不同的方式)?
请帮助,非常感谢!
答案 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实现。