繁体   English   中英

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

[英]How to access the object value with java.util.LinkedHashMap$EntryIterator type

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

物体

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

在此处输入图片说明

如您所见,我有一个对象“ ite”,我需要访问字段“ this $ 0”的值,如何获取它?

编译器添加了此字段,以在内部类中存储对其外部类的引用(当内部类不是静态的时)。 由于有了这个字段,内部类实例可以访问外部类实例的成员(甚至是私有成员)。

该字段的值由outerClassInstance.new InnerClass()设置,因此InnerClass实例中的this$0将包含与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. 将方法的结果LinkedHashMapMap或者如果需要更精确的类型LinkedHashMap

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM