com.sun.jdi
是一个软件包,可让您获取有关正在运行的VM的信息,添加断点,查看堆栈帧等。
如何获取另一个实例的封闭实例?例如,下面是一些代码,用于创建内部类Garfield.Lasagna的4个实例,其中两个实例由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有办法获取包含实例的实例,但似乎并非如此。
或者,我会尝试在调试的VM中使用反射,例如java.lang.Class.getEnclosing{Class,Constructor,Method}(),但我没有看到任何适用于对象/实例的相关方法。
答案 0 :(得分:1)
您可以通过JDI和反射访问它。封闭实例存储为内部类Lasanga
的实例字段。字段的自动生成名称通常为this$0
(因此在上面的示例中,具有此名称的字段的类型为Garfield
)。
要在JDI中访问它,您必须使用ObjectReference的ReferenceType。有three relevant methods of ReferenceType:
通过反射访问它与通常一样,只需要询问名称"this$0"
的字段。
但是,您无法在编译时访问合成定义的变量,要求字段this$0
将导致编译时错误。