我正在研究性能监控系统,它可以将其例程注入现有的程序集中。为此,我试图了解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-direct
和invoke-virtual
之间的区别。
调用方法时,这很简单(如果方法是私有的,则使用invoke-direct
调用,否则调用invoke-virtual
)。对于构造函数来说,情况似乎并非如此。
从另一个构造函数调用时调用invoke-direct
vs invoke-virtual
的规则是什么?
答案 0 :(得分:3)
您可以从另一个构建函数中调用:
public class Foo
{
private int x;
public Foo()
{
this(1);
}
public Foo(int x)
{
this.x = x;
}
}
注意:
你只能链接到一个构造函数,它必须是构造函数体中的第一个语句。
如果您想链接继承的构造函数,可以使用super
代替this
。
invoke-direct
用于constructors
和private methods