编程语言
首页 > 编程语言> > java-构造函数中的invoke-virtual与invoke-direct

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用于构造函数和私有方法

标签:dalvik,smali,java
来源: https://codeday.me/bug/20191119/2038921.html