2013-05-20 4 views
2

com.sun.jdi это пакет, который позволяет получить информацию о запущенной виртуальной машине, добавить точки останова, просматривать кадры стека и т.д.Как вы можете получить экземпляр экземпляра? (Com.sun.jdi)

Как я могу получить охватывающий экземпляр другого экземпляра? Например, вот какой-то код, который создает 4 экземпляра внутреннего класса Garfield.Lasagna, причем каждый из них заключен в другой экземпляр Garfield.

public class Garfield { 
int belly; 
public class Lasagna { 
    Lasagna() {belly++;} 
} 
public static void main(String[] args) { 
    Garfield g1 = new Garfield(); 
    Lasagna l11 = g1.new Lasagna(); 
    Lasagna l12 = g1.new Lasagna(); 
    Garfield g2 = new Garfield(); 
    Lasagna l21 = g2.new Lasagna(); 
    Lasagna l22 = g2.new Lasagna(); 
} 
} 

Я предположил бы, что com.sun.jdi.ObjectReference бы способ, чтобы получить в случае, охватывающий экземпляр, но это, кажется, не так.

Или, я бы попытался использовать отражение в отлаженной виртуальной машине, что-то вроде java.lang.Class.getEnclosing{Class,Constructor,Method}(), но я не вижу никакого связанного метода, который применяется к объектам/экземплярам.

ответ

1

Вы можете получить доступ к нему через JDI и через отражение. Прилагаемый экземпляр хранится как поле экземпляров внутреннего класса Lasanga. Автоматически созданное имя для поля обычно равно this$0 (поэтому в приведенном выше примере поле с этим именем имеет тип Garfield).

Чтобы получить доступ к нему в JDI, вы должны использовать ReferenceType объекта ObjectEeference. Есть three relevant methods of ReferenceType:

  • поле() дает вам все простые поля, а также такие синтетические поля
  • visibleFields() дополнительно дает вам в наследство полого
  • allFields() дополнительно дает вам скрытые поля (и, возможно, повторяет синтетическим)

Доступ к нему через отражение - это то же самое, что и обычно, просто введите поле с именем "this$0".

Но вы не можете получить доступ к синтетически определенной переменной во время компиляции, запросив поле this$0 приведет к ошибке времени компиляции.

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