我需要访问名为$ 0的对象类型java.util.LinkedHashMap $ EntryIterator类型的字段的值,请参见下图。
对象
Iterator<Entry<String, JsonNode>> ite = data.getFields();
正如你所看到的,我有一个对象“ite”,我需要访问字段“this $ 0”的值,如何获得它?
答案 0 :(得分:0)
此字段由编译器添加,以存储在其外部类的内部类引用中(当内部类不是静态时)。由于这个字段,内部类实例可以访问外部类实例的成员(甚至是私有的)。
此字段的值由outerClassInstance.new InnerClass()
设置,因此this$0
实例中的InnerClass
将包含与outerClassInstance
引用相同的值。
您无法直接在
等代码中使用此字段class Outer{
class Inner{
void test(){
System.out.println(this$0);//this will not compile
}
}
}
但您可以通过反射访问它。将返回此字段值的方法代码看起来像
public static Object getOuterInstance(Object inner)
throws NoSuchFieldException, SecurityException,
IllegalArgumentException, IllegalAccessException {
Class<?> clazz = inner.getClass();
Field f = clazz.getDeclaredField("this$0");
f.setAccessible(true);//in case of class placed in different package
return f.get(inner);
}
示例:
class Outer {
private String name;
public Outer(String name) { this.name = name; }
public String getName() { return name; }
class Inner{}
}
class Demo {
public static void main(String[] args) throws Exception {
Outer o1 = new Outer("foo");
Outer o2 = new Outer("bar");
Inner i1 = o1.new Inner();
Inner i2 = o2.new Inner();
System.out.println(((Outer) getOuterInstance(i1)).getName());
System.out.println(((Outer) getOuterInstance(i2)).getName());
}
public static Object getOuterInstance(Object inner)
throws NoSuchFieldException, SecurityException,
IllegalArgumentException, IllegalAccessException {
Class<?> clazz = inner.getClass();
Field f = clazz.getDeclaredField("this$0");
f.setAccessible(true);
return f.get(inner);
}
}
输出:
foo
bar
这意味着我们确实获得了正确的实例。
如果你的例子,你将不得不:
ite
迭代器Map
,或者如果您需要更精确的类型LinkedHashMap
。