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

标签 java dalvik smali

我正在研究性能监控系统,它可以将其例程注入(inject)现有程序集。为此,我试图了解 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 之间的区别。

调用方法时,这很简单(如果方法是私有(private)的,则使用 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 用于构造函数私有(private)方法

关于java - invoke-virtual vs invoke-direct 在构造函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32312843/

相关文章:

java - 在Android中,如何使用Java反射调用sun.misc.Unsafe方法?

java - 在 smali 中设置可取消 true

java - 将 jar 库注入(inject) apk 应用程序

java - 如何在 Facebook 受众网络插页式广告中设置点击计数器?

java - 从 WSDL 创建 Java 类

java - 使单击制表符正确更改插入符号

Android dalvik 垃圾收集可能会崩溃?

java - 验证 XML 元素标记

android - native 代码会导致 Android 中的 Java 代码发生内存损坏吗?

android - Android 上有 apktool 吗?我想在 Android 应用程序中组装 ".smali"并制作新的 ".apk"