smali语言详解之一般/构造方法(函数)的声明与返回值关键字
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语言详解之一般/构造方法(函数)的声明与返回值关键字相关推荐
- smali语言详解之static静态代码块的声明与静态变量初始化赋值位置
smali语言详解之static静态代码块的声明与静态变量初始化赋值位置 一.smali语言的静态代码块声明格式 .method static constructor <clinit>() ...
- smali语言详解之方法的调用
smali语言详解之方法的调用 一.方法调用关键字介绍 smali语言方法调用关键字主要有以下五种 invoke-virtual主要用于非私有实例方法的调用.实例方法指不是构造方法.父类方法等的属于这 ...
- smali语言详解之创建对象
smali语言详解之创建对象 一.smali语言创建对象分两步进行 第一步,声明对象实例,格式如下 new-instance 变量名,该对象对应类的全包名路径 第二步,调用构造方法(如果构造方法内还定 ...
- smali语言详解之字段的声明(变量、常量)
smali语言详解之字段的声明(变量.常量) 一.smali语言的字段声明格式 1.1.非静态变量 .field 权限修饰关键字 变量名:变量类型的全包名路径或与java对应的数据类型关键字 1.2. ...
- smali语言详解之类的声明
smali语言详解之类的声明 一.smali语言的类声明格式 .class 权限修饰关键字 类的全包名路径 二.示例 2.1.一般类(无继承和接口实现) java代码如下 public class T ...
- JUC系列(六) | Callable和Future接口详解使用、FutureTask应用 获取异步线程返回值
多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...
- c语言霍夫曼函数,使用C语言详解霍夫曼树数据结构
1.基本概念 a.路径和路径长度 若在一棵树中存在着一个结点序列 k1,k2,--,kj, 使得 ki是ki+1 的双亲(1<=i 从 k1 到 kj 所经过的分支数称为这两点之间的路径长度,它 ...
- c语言getline函数什么意思,详解C++ cin.getline函数
cin 虽然可以使用 cin 和 >> 运算符来输入字符串,但它可能会导致一些需要注意的问题. 当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格.制表符或换行符).一旦它接 ...
- php打印出函数的内容吗,PHP打印函数集合详解以及PHP打印函数对比详解(精)
1 echo();2 print();3 die();4 printf();5 sprintf();6 print_r();7 var_dump(); 1 echo() 可以同时输出多个字符串,可以多 ...
最新文章
- Python基于statsmodels包构建多元线性回归模型:模型构建、模型解析、模型推理预测
- 使用js实现微信小页面翻页的原理介绍
- 剑指offer 面试64题
- 洛谷 CF1043F Make It One 解题报告
- SAP Spartacus OccEndpointsService单元测试的依赖注入
- react 消息订阅-发布机制(解决兄弟组件通信问题)
- VR为难民发声,传递人道主义精神
- Mac终端的一些操作命令
- MapGIS数据中心是什么?
- Android studio 申请读写权限,相机权限。
- html怎样设置图片的圆角矩形,怎么把矩形变成圆角 ps怎么在原来的矩形中改成圆角...
- 人工智能谓词逻辑——猴子摘香蕉问题
- vue中使用阿里巴巴矢量图标库并修改样式
- win10如何使用WinSAT测试体验指数
- Fluent中的各种初始化
- 【echarts】在柱状图上方显示数值
- laya 怎么生成签名_手写签名在线生成器一笔签-手写签名在线生成器微信
- 制造型企业该如何选择质量管理系统?
- linux文件系统——磁盘分区、Ext格式、文件属性与权限
- Java培训学些什么?