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


一、 smali语言的方法声明格式

.method.end method成对出现,类似于java中的花括号

1.1、非静态的一般方法

.method 权限修饰关键字 方法名(参数类型)返回值类型#方法内容
.end method

1.2、静态的一般方法

.method 权限修饰关键字 static 方法名(参数类型)返回值类型#方法内容
.end method

1.3、构造方法

.method 权限修饰关键字 constructor <init>(参数类型)返回值类型#方法内容
.end method

二、示例

2.1、空参且返回值为空的方法示例

以下为java全部代码

package com.ylw.helloworld;public class Test {public static void getName(){}}

对应的smali全部代码如下

.class public Lcom/ylw/helloworld/Test;#(此行不可删)Lcom/ylw/helloworld/Test;为类的全包名路径,根据实际情况有所不同
.super Ljava/lang/Object;#(此行不可删)声明父类,当没有使用extends写明继承时,默认继承Object类
.source "Test.java"#(此行可删)#表示此smali代码对应的java源码文件# direct methods#自动生成的无参构造
.method public constructor <init>()V.registers 1.prologue.line 3invoke-direct {p0}, Ljava/lang/Object;-><init>()Vreturn-void
.end method#与.method成对出现,表示方法的结束.method public static getName()V#最后的V表示返回值为void,非静态不写static即可.registers 0.prologue.line 7return-void#与返回值为V相对应
.end method#与.method成对出现,表示方法的结束

2.2、有参且返回值为空的方法示例

2.2.1、概览对比

java全部代码如下

package com.ylw.helloworld;public class Test {public static void getNameA(int a){}public static void getNameB(int a,String b){}public static void getNameC(String b,int a){}public static void getNameD(String b,int a,String[] args){}}

为了便于对比,以下只展示和java代码中四个方法对应的smali代码

.method public static getNameA(I)V.registers 1.param p0, "a"    # I.prologue.line 7return-void
.end method.method public static getNameB(ILjava/lang/String;)V.registers 2.param p0, "a"    # I.param p1, "b"    # Ljava/lang/String;.prologue.line 11return-void
.end method.method public static getNameC(Ljava/lang/String;I)V.registers 2.param p0, "b"    # Ljava/lang/String;.param p1, "a"    # I.prologue.line 15return-void
.end method.method public static getNameD(Ljava/lang/String;I[Ljava/lang/String;)V.registers 3.param p0, "b"    # Ljava/lang/String;.param p1, "a"    # I.param p2, "args"    # [Ljava/lang/String;.prologue.line 19return-void
.end method

2.2.2、单参且返回值为空的方法详解

java代码如下

    public static void getNameA(int a){}

对应的smali代码如下

.method public static getNameA(I)V#括号里的大写I代表参数类型为int,结尾V代表返回值为void.registers 1.param p0, "a"    # I#(此行可不写)此行代表第一个参数p0在原java代码里的名称是a,后面自动生成的注释提示参数类型为int.prologue.line 7return-void#返回值为空与void对应
.end method

2.2.2、多参且返回值为空的方法详解

java代码如下

    public static void getNameB(int a,String b){}

对应的smali代码如下,注意当有多个参数时,smali语言中无需用符号分隔参数,直接顺着写即可,getNameB(ILjava/lang/String;)括号内第一个字母I表示第一个参数类型为int,第二串全包名路径Ljava/lang/String;表示第二个参数类型为String,因为java中String为类而不是基本数据类型,所以要写全包名路径

.method public static getNameB(ILjava/lang/String;)V#注意当有多个参数时,smali语言中无需用符号分隔参数,直接顺着写即可.registers 2.param p0, "a"    # I#(此行可不写)此行代表第一个参数p0在原java代码里的名称是a,后面自动生成的注释提示参数类型为int.param p1, "b"    # Ljava/lang/String;#(此行可不写)此行代表第一个参数p0在原java代码里的名称是b,后面自动生成的注释提示参数类型为String.prologue.line 11return-void#返回值为空与void对应
.end method

2.3、返回值非空的方法示例

2.3.1、方法返回关键字介绍

方法返回关键字主要有以下四种

  • return-void返回值为空时使用
  • return-object返回值为类对象时使用,如java中的字符串String和数组类型
  • return返回值为非64位基本数据类型时使用,如int、float、boolean,为long、double时除外,因为long、double为64位数据类型
  • return-wide返回值为64位数据类型时使用,如long、double

方法返回关键与对应的数据类型关系表如下

smali方法返回关键字 对应java的数据类型
return byte
return short
return int
return-wide long(64位)
return float
return-wide double(64位)
return char
return boolean
return-void void
return-object 数组
return-object Object、String字符串、自己定义的类对象

2.3.2、方法返回值非空示例和详解

java代码如下,返回值为字符串hello

    public static String getNameA(int a){return "hello";}

对应的smali代码如下,使用关键字return-object进行String类型的返回

.method public static getNameA(I)Ljava/lang/String;.registers 2.param p0, "a"    # I.prologue.line 6const-string v0, "hello"#定义字符串常量hello放到v0中return-object v0#返回v0,v0中存放的是String类型的hello,所以使用关键字return-object
.end method

2.4、构造方法示例

java完整代码如下,java中不显式写出构造方法时会默认加上

package com.ylw.helloworld;public class Test {}

对应的完整smali代码如下

.class public Lcom/ylw/helloworld/Test;#(此行不可删)Lcom/ylw/helloworld/Test;为类的全包名路径,根据实际情况有所不同
.super Ljava/lang/Object;#(此行不可删)声明父类,当没有使用extends写明继承时,默认继承Object类
.source "Test.java"#(此行可删)#表示此smali代码对应的java源码文件# direct methods#自动生成的注释
.method public constructor <init>()V#无参构造,V表示返回值为void.registers 1.prologue.line 3invoke-direct {p0}, Ljava/lang/Object;-><init>()V#调用父类Object类的构造方法,invoke为方法调用关键字,此处不详细介绍return-void#对应返回值为空
.end method#方法结束标识

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

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

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

  2. smali语言详解之方法的调用

    smali语言详解之方法的调用 一.方法调用关键字介绍 smali语言方法调用关键字主要有以下五种 invoke-virtual主要用于非私有实例方法的调用.实例方法指不是构造方法.父类方法等的属于这 ...

  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. JUC系列(六) | Callable和Future接口详解使用、FutureTask应用 获取异步线程返回值

    多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...

  7. c语言霍夫曼函数,使用C语言详解霍夫曼树数据结构

    1.基本概念 a.路径和路径长度 若在一棵树中存在着一个结点序列 k1,k2,--,kj, 使得 ki是ki+1 的双亲(1<=i 从 k1 到 kj 所经过的分支数称为这两点之间的路径长度,它 ...

  8. c语言getline函数什么意思,详解C++ cin.getline函数

    cin 虽然可以使用 cin 和 >> 运算符来输入字符串,但它可能会导致一些需要注意的问题. 当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格.制表符或换行符).一旦它接 ...

  9. php打印出函数的内容吗,PHP打印函数集合详解以及PHP打印函数对比详解(精)

    1 echo();2 print();3 die();4 printf();5 sprintf();6 print_r();7 var_dump(); 1 echo() 可以同时输出多个字符串,可以多 ...

最新文章

  1. Python基于statsmodels包构建多元线性回归模型:模型构建、模型解析、模型推理预测
  2. 使用js实现微信小页面翻页的原理介绍
  3. 剑指offer 面试64题
  4. 洛谷 CF1043F Make It One 解题报告
  5. SAP Spartacus OccEndpointsService单元测试的依赖注入
  6. react 消息订阅-发布机制(解决兄弟组件通信问题)
  7. VR为难民发声,传递人道主义精神
  8. Mac终端的一些操作命令
  9. MapGIS数据中心是什么?
  10. Android studio 申请读写权限,相机权限。
  11. html怎样设置图片的圆角矩形,怎么把矩形变成圆角 ps怎么在原来的矩形中改成圆角...
  12. 人工智能谓词逻辑——猴子摘香蕉问题
  13. vue中使用阿里巴巴矢量图标库并修改样式
  14. win10如何使用WinSAT测试体验指数
  15. Fluent中的各种初始化
  16. 【echarts】在柱状图上方显示数值
  17. laya 怎么生成签名_手写签名在线生成器一笔签-手写签名在线生成器微信
  18. 制造型企业该如何选择质量管理系统?
  19. linux文件系统——磁盘分区、Ext格式、文件属性与权限
  20. Java培训学些什么?

热门文章

  1. 个人独立博客的去与从
  2. HMM(隐马尔可夫)简介
  3. [Android开发]不操作Bitmap实现圆角ImageView、圆形ImageView,支持添加背景圆形或圆角矩形边框、边框支持渐变色
  4. HTML文字在图片上显示
  5. 想做软件测试的女孩子看这里
  6. 【C语言】scanf函数
  7. firstChild
  8. Spring5-Spring的基本配置
  9. 全球与中国泳衣布料市场深度研究分析报告(2021)
  10. 为什么计算机语言不用中文,为什么中文不能用来编程?