![](/img/trans.png)
[英]How can I get an instance of non-named inner class by Java reflection?
[英]How to get pirvate inner class instance with reflection in Java?
public class OuterClass {
private static class InnerClass {
public int id = 0;
}
private static InnerClass[] innerArr;
}
需要在Java中通過反射獲取innerArr值。
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class<?> cla = loader.loadClass("OuterClass");
Field innerArrRef = cla.getDeclaredField("innerArr");
innerArrRef.setAccessible(true);
OuterClass.InnerClass[] innerArrValue = (OuterClass.InnerClass[])innerArrRef.get(cla);
上面的代碼不適用於InnerClass是私有類。
讓我們稍微調整一下OuterClass
代碼以使其更有趣:將InnerClass
實例InnerClass
數組中:
private static InnerClass[] innerArr = { new InnerClass() };
現在,您不能直接在另一個嘗試使用反射獲取靜態字段的類中直接引用私有類型InnerClass
。 您可以首先將其稱為對象數組。
public static void main(String[] args) throws Exception {
Class<?> cla = OuterClass.class;
Field innerArrRef = cla.getDeclaredField("innerArr");
innerArrRef.setAccessible(true);
Object[] innerArrValue = (Object[]) innerArrRef.get(cla);
您需要使用反射和Class
對象才能使用InnerClas類型。
一種方法是使用declaredClasses
的財產OuterClass
'類對象:
Class<?> inner = cla.getDeclaredClasses()[0];
但是,如果成員類不止一個,則需要遍歷數組並搜索正確的成員類。 另一種方法是使用Javac將為您的InnerClass提供全限定類型名稱的知識,該名稱類似於mypackage.OuterClass$InnerClass
:
Class<?> inner = cla.getClassLoader().loadClass(cla.getName() + "$InnerClass");
擁有InnerClass的類對象后,就可以使用反射來訪問其字段和方法:
Field id = inner.getField("id");
System.out.println("Inner id: " + id.getInt(innerArrValue[0]));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.