Как вы получаете включающий экземпляр экземпляра? (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
вызовет ошибку во время компиляции.