码迷,mamicode.com
首页 > 其他好文 > 详细

(4)Smali系列学习之Smali语法详解内部类

时间:2018-05-05 13:22:01      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:nbsp   匿名   read   学习   介绍   私有方法   ali   代码   methods   

在这一节,我们来介绍一下内部类。对于Java文件中的每一个内部类,都会产生一个单独的smali文件,比如ActivityThread$1.smali。这些文件的命名规范是如果是匿名内部类,则命名规则是外部类+$+数字,否则的话是外部类+$+内部类的名字。
    
当在内部类中调用外部类的私有方法时,编译器会自动合成一个静态函数。比如下面这个类:
public class  Hello {
    public class  A {
        void  func() {
            setup();
        }
    }


    private void  setup() {
    }
}


我们在内部类A的func方法中调用了外部类的setup方法,最终编译的smali代码为:
Hello$A.smali文件代码片段:
# virtual methods
.method func()V
    .locals 1

    .prologue
    .line 5
    iget-object v0, p0, LHello$A;->this$0:LHello;

    #calls: LHello;->setup()V
    invoke-static {v0}, LHello;->access$000(LHello;)V

    .line 6
    return-void
.end method

Hello.smali代码片段:
.method static synthetic access$000(LHello;)V
    .locals 0
    .parameter

    .prologue
    .line 1
    invoke-direct {p0}, LHello;->setup()V

    return-void
.end method


可以看到,编译器自动合成了一个access$000方法,假如当我们在一个较复杂的内部类中加入了一个对外部类私有方法的调用,虽然只是导致新合成了一个方法,但是这些合成的方法名可能都会有变化,这样的结果就是smali文件差异较大,这个时候需要仔细分析,找到调用的私有方法。然后给合成的方法选取一个未被使用的名字。

(4)Smali系列学习之Smali语法详解内部类

标签:nbsp   匿名   read   学习   介绍   私有方法   ali   代码   methods   

原文地址:https://www.cnblogs.com/eustoma/p/8994320.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!