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

时间:2014-10-16 14:17:54

标签: java

我需要访问名为$ 0的对象类型java.util.LinkedHashMap $ EntryIterator类型的字段的值,请参见下图。

对象

Iterator<Entry<String, JsonNode>> ite = data.getFields();

enter image description here

正如你所看到的,我有一个对象“ite”,我需要访问字段“this $ 0”的值,如何获得它?

1 个答案:

答案 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

这意味着我们确实获得了正确的实例。

如果你的例子,你将不得不:

  1. 遍历ite迭代器
  2. 中的每个元素
  3. 对来自iterator的每个元素使用此方法
  4. 将方法的结果投射到Map,或者如果您需要更精确的类型LinkedHashMap