2015-08-31 2 views
3

Я работаю над системой контроля производительности, которая может внедрять ее подпрограммы в существующую сборку. Для этого я пытаюсь понять, как работает код dalvik.invoke-virtual vs invoke-direct в конструкторах

Вот иллюстрация того, что я пытаюсь выполнить. Входной класс может выглядеть следующим образом:

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 при вызове одного конструктора из другого?

ответ

3

Вы можете вызвать один конструктор из другого:

public class Foo 
{ 
    private int x; 

    public Foo() 
    { 
     this(1); 
    } 

    public Foo(int x) 
    { 
     this.x = x; 
    } 
} 

Примечание:

  1. вы можете только цепь одного конструктора, и он должен быть первым оператором в вашем теле конструктора ,

  2. Если вы хотите связать унаследованный конструктор, вы можете использовать super вместо this.

  3. invoke-direct используется для constructors и private methods

+0

К сожалению, моя ошибка. Я исправил код в вопросе –

+0

Я пытаюсь вызвать один конструктор из другого, и упомянутый вами код, вероятно, скомпилируется в Foo(), используя invoke-direct для вызова Foo (int) –

+0

@ArsenZahray: Каково ваше требование? – seahawk

Смежные вопросы