invoke-virtual vs invoke-direct 在构造函数中

invoke-virtual vs invoke-direct in constructors

我正在开发性能监控系统,它可以将其例程注入现有程序集。为此,我试图了解 dalvik 代码的工作原理。

这是我要完成的工作的示例。输入 class 可能如下所示:

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

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

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-directinvoke-virtual 的规则是什么?

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

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