我正在研究性能监控系统,该系统可以将其例程注入现有的程序集中.为此,我试图了解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用于构造函数和私有方法