![](/img/trans.png)
[英]Could not find MessageBodyWriter for response object of type: java.util.LinkedHashMap of media type: application/json
[英]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
這意味着我們確實得到了正確的實例。
對於您的示例,您將必須:
ite
迭代器中的每個元素 LinkedHashMap
為Map
或者如果需要更精確的類型LinkedHashMap
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.