invoke-virtual vs invoke-direct 在构造函数中
invoke-virtual vs invoke-direct in constructors
我正在开发性能监控系统,它可以将其例程注入现有程序集。为此,我试图了解 dalvik 代码的工作原理。
这是我要完成的工作的示例。输入 class 可能如下所示:
class MyClass{
public MyClass(__params__){
//initialization code
}
}
我想为 class 添加代码,如下所示:
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
与 invoke-virtual
的规则是什么?
您可以从一个构造函数调用另一个构造函数:
public class Foo
{
private int x;
public Foo()
{
this(1);
}
public Foo(int x)
{
this.x = x;
}
}
注:
您只能链接到一个构造函数,并且它必须是构造函数主体中的第一条语句。
如果要链接继承的构造函数,可以使用super
代替this
。
invoke-direct
用于 constructors
和 private methods
我正在开发性能监控系统,它可以将其例程注入现有程序集。为此,我试图了解 dalvik 代码的工作原理。
这是我要完成的工作的示例。输入 class 可能如下所示:
class MyClass{
public MyClass(__params__){
//initialization code
}
}
我想为 class 添加代码,如下所示:
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
与 invoke-virtual
的规则是什么?
您可以从一个构造函数调用另一个构造函数:
public class Foo
{
private int x;
public Foo()
{
this(1);
}
public Foo(int x)
{
this.x = x;
}
}
注:
您只能链接到一个构造函数,并且它必须是构造函数主体中的第一条语句。
如果要链接继承的构造函数,可以使用
super
代替this
。invoke-direct
用于constructors
和private methods