在构造函数

时间:2015-08-31 13:48:14

标签: java dalvik smali

我正在研究性能监控系统,它可以将其例程注入现有的程序集中。为此,我试图了解dalvik代码是如何工作的。

以下是我想要完成的事情的说明。输入类可能如下所示:

class MyClass{
    public MyClass(__params__){
        //initialization code
    }
}

我想为类添加代码,如下所示:

class MyClass{
    public MyClass(__params__){
        this(_params__,0);
        //tracking and performance initialization code
    }

    public MyClass(__params__, int init){
        //old initialization code
    }
}

到目前为止,导致大多数错误的原因是从另一个构建函数调用时invoke-directinvoke-virtual之间的区别。

调用方法时,这很简单(如果方法是私有的,则使用invoke-direct调用,否则调用invoke-virtual)。对于构造函数来说,情况似乎并非如此。

从另一个构造函数调用时调用invoke-direct vs invoke-virtual的规则是什么?

1 个答案:

答案 0 :(得分:3)

您可以从另一个构建函数中调用:

public class Foo
{
    private int x;

    public Foo()
    {
        this(1);
    }

    public Foo(int x)
    {
        this.x = x;
    }
}

注意:

  1. 你只能链接到一个构造函数,它必须是构造函数体中的第一个语句。

  2. 如果您想链接继承的构造函数,可以使用super代替this

  3. invoke-direct用于constructorsprivate methods