java-构造函数中的invoke-virtual与invoke-direct

我正在研究性能监控系统,该系统可以将其例程注入现有的程序集中.为此,我试图了解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
    }
}

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

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

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

解决方法:

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

public class Foo
{
    private int x;

    public Foo()
    {
        this(1);
    }

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

注意:

>您只能链接到一个构造函数,并且它必须是构造函数主体中的第一条语句.
>如果要链接继承的构造函数,则可以使用super代替它.
> invoke-direct用于构造函数和私有方法

上一篇:java-.catchall是否用于在smali中指示Dalvik字节码的finally子句?


下一篇:android-等待直到最后一个调试器命令完成