簡體   English   中英

如何在Java中通過反射獲得pirvate內部類實例?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM