簡體   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