smali语法之方法与字段

来源:互联网 发布:伊辛模型 知乎 编辑:程序博客网 时间:2024/05/17 04:06

1、基本介绍

       之前我们介绍过smali语法格式中的数据类型,包括基本数据类型,与引用数据类型(对象与数组),今天我们再介绍一下语法中的方法与字段。


2、方法

       方法的表现形式为:

Lpackage/name/ObjectName;——>methodName(III)Z  
        解释说明:

Lpackage/name/ObjectName  表示类型
methodName   表示方法名
III   表示参数(这里表示为3个整型参数)

       举例说明:

       这里以Android开发中常见的onDestory()方法为例,这里是该方法的smali形式:

.method protected onDestroy()V.locals 0.prologue.line 277invoke-super {p0}, Lcom/disney/common/BaseActivity;->onDestroy()V.line 279return-void.end method

注意:方法的参数是一个接一个的,中间没有隔开;


3、字段

        字段的表示形式:

Lpackage/name/ObjectName;——>FieldName:Ljava/lang/String;
        解释说明:

Lpackage/name/ObjectName;包名

FieldName:字段名

Ljava/lang/String;字段类型

        举例说明:

java形式:public String url;smali形式:.field public url:Ljava/lang/String;

4、完整示例

        这里提供一个简单的带有方法的Hello类,通过反编译为smali类型,对比说明上面的解释:

        Hello.java的源码如下所示:

public class Hello{public int fun(int a,int b){return (a+b)*(a-b);}public static void main(String[] args){Hello hello = new Hello();System.out.println(hello.fun(5,3));}}
       Hello.smali的源码格式如下所示:

.class public LHello;.super Ljava/lang/Object;.source "Hello.java"# direct methods.method public constructor <init>()V    .registers 1    .prologue    .line 1    invoke-direct {p0}, Ljava/lang/Object;-><init>()V    return-void.end method.method public static main([Ljava/lang/String;)V    .registers 5    .prologue    .line 7    new-instance v0, LHello;    invoke-direct {v0}, LHello;-><init>()V    .line 8    sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;    const/4 v2, 0x5    const/4 v3, 0x3    invoke-virtual {v0, v2, v3}, LHello;->fun(II)I    move-result v0    invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V    .line 9    return-void.end method# virtual methods.method public fun(II)I    .registers 5    .prologue    .line 3    add-int v0, p1, p2    sub-int v1, p1, p2    mul-int/2addr v0, v1    return v0.end method

5、总结分析

        Hello.smali中除了我们提到的数据类型,方法和字段之外,还涉及到了一些寄存器等方面的知识,但是这不是我们本次博文所讨论的重点,一次只要知晓一个知识点便可。在下一篇博文中,笔者将重点向读者介绍smali语法格式中的寄存器以及其他内容!



0 0