方法
调用方法的格式如下:
invoke-xxx {} , Lpackage/name/ObjectName;->methodName(I)Z
xxx 表示对不同类型的方法使用的不同的关键字。
{} 用于列出调用者(可能没有)和方法的参数
逗号后面的部分是方法的签名,分三部分:
第一部分表示类的签名。
第二部分是固定的:->
第三部分是方法签名:方法名(参数名)返回值。
参数
调用时,存储于 {} 中的部分。
对于非静态方法 ,{} 中的第一个值表示调用者:即调用该方法的对象。后面的才是传入到方法中的各个参数。
对于静态方法,{} 中的是传入到方法中的所有参数,不存在调用者 —— 因为静态方法没有调用者。
调用
实例方法
-
invoke-virtual : 调用当前实例中被 public , protected 或没有修饰符的方法。
-
invoke-direct : 调用实例中被 private 修饰的方法。
如:
private void test() {
testPrivate(); // 被 private 所修饰。以下三个方法类同。
testDefault(); // 该方法没有任何修改符
testProtected();
testPublic();
}
其对应的 smali 为:
.method private test()V
.registers 1 # 只使用一个寄存器,用于存储 this
.prologue
.line 33
invoke-direct {p0}, Lcom/demo/adapter/MainActivity;->testPrivate()V
.line 34
invoke-virtual {p0}, Lcom/demo/adapter/MainActivity;->testDefault()V
.line 35
invoke-virtual {p0}, Lcom/demo/adapter/MainActivity;->testProtected()V
.line 36
invoke-virtual {p0}, Lcom/demo/adapter/MainActivity;->testPublic()V
.line 37
return-void
.end method
静态方法
无论方法被何修饰词修饰,都只能通过 invoke-static 调用。
父类方法
通过 invoke-super 调用父类方法。
接口方法
通过 invoke-interface 调用接口中的方法。
返回值
关键字 | 含义 |
---|---|
return-void | 没有返回值或者返回 void |
return-object | 返回一个对象的引用 |
return-wide | 返回一个 64 位的非对象的值 |
return | 返回一个 32 位的非对象的值 |
网友评论