smali语言详解之方法的调用


一、方法调用关键字介绍

smali语言方法调用关键字主要有以下五种

  • invoke-virtual主要用于非私有实例方法的调用。实例方法指不是构造方法、父类方法等的属于这个类的一般方法。
  • invoke-direct主要用于构造方法(包括父类的构造方法)和私有方法的调用
  • invoke-static主要用于静态方法的调用
  • invoke-super主要用于父类成员方法(不包括父类构造方法)的调用
  • invoke-interface主要用于接口方法的调用

二、使用invoke-virtual进行非私有实例方法的调用

2.1、方法调用格式

invoke-virtual {参数}, 方法所属类的全包名路径->方法名(参数类型)方法返回值类型

当有多个参数时,格式为{参数1,参数2},使用其他关键字调用时相同

2.2、方法调用示例

完整的java代码如下

package com.ylw.helloworld;public class Test {//Test类的构造方法,调用getName方法public Test(String a){getName();//java里默认是this.getName(),不写这个this也会有}//非私有实例方法getName()public String getName(){return "hello";}}

对应的完整smali代码如下,这里参数里有一个p0,因为getName()方法虽然无参,但是需要当前对象进行调用,即this.getName(),p0指当前对象,可以理解为java里的this

.class public Lcom/ylw/helloworld/Test;
.super Ljava/lang/Object;
.source "Test.java"# direct methods
.method public constructor <init>(Ljava/lang/String;)V#构造方法.registers 2.param p1, "a"    # Ljava/lang/String;.prologue.line 6invoke-direct {p0}, Ljava/lang/Object;-><init>()V#调用父类Object的构造方法.line 7invoke-virtual {p0}, Lcom/ylw/helloworld/Test;->getName()Ljava/lang/String;#调用非私有实例方法getName()#这里参数里有一个p0,因为getName虽然无参,但是需要当前对象进行调用,即this.getName(),p0指当前对象,可以理解为java里的this.line 8return-void
.end method# virtual methods
.method public getName()Ljava/lang/String;#非私有实例方法getName().registers 2.prologue.line 12const-string v0, "hello"return-object v0
.end method

三、使用invoke-direct进行构造方法(包括父类的构造方法)和私有方法的调用

3.1、方法调用格式

构造方法的调用格式如下

invoke-direct{参数}, 方法所属类的全包名路径-><init>(参数类型)方法返回值类型

私有方法的调用格式如下

invoke-direct{参数}, 方法所属类的全包名路径->方法名(参数类型)方法返回值类型

3.2、方法调用示例

完整的java代码如下

package com.ylw.helloworld;public class Test {//Test类的构造方法,调用getName方法public Test(String a){getName();}//私有实例方法getName()private String getName(){return "hello";}}

对应的完整smali代码如下

.class public Lcom/ylw/helloworld/Test;
.super Ljava/lang/Object;
.source "Test.java"# direct methods
.method public constructor <init>(Ljava/lang/String;)V#构造方法.registers 2.param p1, "a"    # Ljava/lang/String;.prologue.line 6invoke-direct {p0}, Ljava/lang/Object;-><init>()V#调用父类Object的构造方法.line 7invoke-direct {p0}, Lcom/ylw/helloworld/Test;->getName()Ljava/lang/String;#调用私有实例方法getName().line 8return-void
.end method.method private getName()Ljava/lang/String;#私有实例方法getName().registers 2.prologue.line 12const-string v0, "hello"return-object v0
.end method

四、使用invoke-static进行静态方法的调用

4.1、方法调用格式

静态方法的调用格式如下

invoke-static{参数}, 方法所属类的全包名路径->方法名(参数类型)方法返回值类型

4.2、方法调用示例

完整的java代码如下

package com.ylw.helloworld;public class Test {//Test类的构造方法,调用getName方法public Test(String a){getName();}//静态方法getName()private static String getName(){return "hello";}}

对应的完整smali代码如下,注意这里{}里没有p0,因为静态方法随类加载不需要创建对象,所以无需使用this

.class public Lcom/ylw/helloworld/Test;
.super Ljava/lang/Object;
.source "Test.java"# direct methods
.method public constructor <init>(Ljava/lang/String;)V#构造方法.registers 2.param p1, "a"    # Ljava/lang/String;.prologue.line 6invoke-direct {p0}, Ljava/lang/Object;-><init>()V#调用父类Object的构造方法.line 7invoke-static {}, Lcom/ylw/helloworld/Test;->getName()Ljava/lang/String;#调用静态方法getName()#注意这里{}里没有p0,因为静态方法随类加载不需要创建对象,所以无需使用this.line 8return-void
.end method.method private static getName()Ljava/lang/String;.registers 1.prologue.line 12const-string v0, "hello"return-object v0
.end method

smali语言详解之方法的调用相关推荐

  1. smali语言详解之一般/构造方法(函数)的声明与返回值关键字

    smali语言详解之一般/构造方法(函数)的声明与返回值关键字 一. smali语言的方法声明格式 .method与.end method成对出现,类似于java中的花括号 1.1.非静态的一般方法 ...

  2. smali语言详解之static静态代码块的声明与静态变量初始化赋值位置

    smali语言详解之static静态代码块的声明与静态变量初始化赋值位置 一.smali语言的静态代码块声明格式 .method static constructor <clinit>() ...

  3. smali语言详解之创建对象

    smali语言详解之创建对象 一.smali语言创建对象分两步进行 第一步,声明对象实例,格式如下 new-instance 变量名,该对象对应类的全包名路径 第二步,调用构造方法(如果构造方法内还定 ...

  4. smali语言详解之字段的声明(变量、常量)

    smali语言详解之字段的声明(变量.常量) 一.smali语言的字段声明格式 1.1.非静态变量 .field 权限修饰关键字 变量名:变量类型的全包名路径或与java对应的数据类型关键字 1.2. ...

  5. smali语言详解之类的声明

    smali语言详解之类的声明 一.smali语言的类声明格式 .class 权限修饰关键字 类的全包名路径 二.示例 2.1.一般类(无继承和接口实现) java代码如下 public class T ...

  6. JSPatch实现原理详解:让JS调用/替换任意OC方法

    JSPatch实现原理详解:让JS调用/替换任意OC方法 2015-07-10 09:05 编辑: suiling 分类:iOS开发 来源:bang JSPatch以小巧的体积做到了让JS调用/替换任 ...

  7. Drools 规则语言详解(上)

    http://www.blogjava.net/guangnian0412/archive/2006/06/09/51574.html http://www.blogjava.net/guangnia ...

  8. java同步异步调用_详解java 三种调用机制(同步、回调、异步)

    1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,jsPwwCe它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消 ...

  9. [深入浅出Cocoa]之消息(二)-详解动态方法决议(Dynamic Method Resolution)

    [深入浅出Cocoa]之消息(二)-详解动态方法决议(Dynamic Method Resolution) 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循&quo ...

最新文章

  1. 《Objective-c》Foundation框架 -(字符串:NSString和NSMutableString)
  2. CAR-T治疗的临床前药理学模型
  3. Android中获取网络图片的三种方法
  4. java整型和浮点型_Java基本的程序结构设计 整形和浮点型
  5. Microsoft Updater Application Block 1.5.3 服务器端manifest文件设计 [翻译]
  6. 收藏 | 使用 Mask-RCNN 在实例分割应用中克服过拟合
  7. spring的@primary和@qualifier注解解决一个接口多个实现的注入问题
  8. IOS 预览pdf,word文档的集中方式
  9. nyoj---快速查找素数
  10. 论文阅读(12) 与其他后生动物相比,水母被动能量的重新获取有助于推进优势(2013)
  11. 删除远程桌面登录的记录(mstsc)
  12. 多商户Saas模式云进销存系统,源码分享
  13. 笑声的音效素材,几百个你想要的都在这
  14. Android进阶——更节电的后台任务JobScheduler 机制使用详解
  15. MATLAB 自动控制原理 传递函数单位阶跃响应曲线绘制
  16. 5.3.5—二叉查找树—Convert Sorted List to Binary Sear Tree
  17. opencv3/C++ 机器学习-决策树/DTrees
  18. pythoncad标注教程_CAD 2014二维三维建模渲染标注基础与提升视频教程
  19. 研华微型计算机biso,研华主板bios设置方法
  20. 金仓数据库KingbaseES客户端编程接口指南-ODBC(6. KingbaseES ODBC 的扩展属性)

热门文章

  1. 地表最强22个互联网定律和原则:炒作周期、依赖反转原则、Spotify模型……
  2. 全方位事件监控管理,阿里云日志服务Kubernetes事件中心正式上线
  3. 概率论与数理统计之几何概型频率与概率
  4. 计算机网络的产生和发展
  5. 你不得不了解的深度学习知识(二)
  6. 墨画子卿第二章第9节:小悠
  7. 艺术饭 x 版权猫:塔链科技“鲸确”精确云清算支持ArtFin艺术饭之文艺金融战略
  8. 看不上AI “元宇宙”之父踏进币圈
  9. python中config命令_Python config.config方法代码示例
  10. FreeMarker模板使用方法讲解