如何使用java.util.LinkedHashMap$EntryIterator类型访问对象值

如何使用java.util.LinkedHashMap$EntryIterator类型访问对象值,java,Java,我需要访问对象类型java.util.LinkedHashMap$EntryIterator类型的名为this$0的字段的值,请参见下图 对象 Iterator<Entry<String, JsonNode>> ite = data.getFields(); 如您所见,我有一个对象ite,我需要访问字段this$0的值,如何获取它?当内部类不是静态的时,编译器将此字段添加到外部类的内部类引用中。由于该字段,内部类实例可以访问外部类实例的成员,甚至是私有成员 此字段的值由

我需要访问对象类型java.util.LinkedHashMap$EntryIterator类型的名为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