Как вы получаете включающий экземпляр экземпляра? (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 ObjectReference. Существует три соответствующих метода ReferenceType:

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

Доступ к нему с помощью отражения такой же, как обычно, просто спросите поле имени "this$0",

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

Другие вопросы по тегам