如何使用java.util.LinkedHashMap$EntryIterator类型访问对象值
我需要访问对象类型java.util.LinkedHashMap$EntryIterator类型的名为this$0的字段的值,请参见下图 对象如何使用java.util.LinkedHashMap$EntryIterator类型访问对象值,java,Java,我需要访问对象类型java.util.LinkedHashMap$EntryIterator类型的名为this$0的字段的值,请参见下图 对象 Iterator<Entry<String, JsonNode>> ite = data.getFields(); 如您所见,我有一个对象ite,我需要访问字段this$0的值,如何获取它?当内部类不是静态的时,编译器将此字段添加到外部类的内部类引用中。由于该字段,内部类实例可以访问外部类实例的成员,甚至是私有成员 此字段的值由
Iterator<Entry<String, JsonNode>> ite = data.getFields();
如您所见,我有一个对象ite,我需要访问字段this$0的值,如何获取它?当内部类不是静态的时,编译器将此字段添加到外部类的内部类引用中。由于该字段,内部类实例可以访问外部类实例的成员,甚至是私有成员 此字段的值由OuterCasInstance.new InnerClass设置,因此InnerClass实例中的$0将包含与OuterCasInstance引用相同的值 您不能在类似这样的代码中直接使用此字段
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);
}
这意味着我们确实得到了正确的实例
在您的示例中,您必须:
迭代ite迭代器中的每个元素
对迭代器中的每个元素使用此方法
将方法的结果强制转换为映射,或者如果需要更精确的类型LinkedHashMap。
这不是迭代器来自的原始LinkedHashMap吗?此$0看起来像一个映射。此字段是内部类型实例与其外部类型实例之间的连接。在我们的示例中,它将表示LinkedHashMap,在其上创建了内部EntryIterator的实例。不管怎样,你想在调试器/运行时/单元测试时访问它吗?也共享代码,让我们知道你想得到什么?@Pshemo我只有一个ite对象,我想得到这个$0字段的值,{Version=0,name=RODRIGO RODRIGUES等等……就是这样
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