2017-04-18 51 views
0
public class OuterClass { 
    private static class InnerClass { 
     public int id = 0; 
    } 
    private static InnerClass[] innerArr; 
} 

需要在Java中使用反射來獲取innerArr值。如何用Java中的反射獲取pirvate內部類實例?

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是一個私人類。

+1

發佈您嘗試的[mcve]並描述您遇到問題的位置。 –

+0

把'InnerClass'這個名稱給聲明爲'private static class InnerClass'的成員類型是個壞主意,因爲根據Java中的定義,內部類是未聲明爲'static'的成員類。這使得名稱「Inner'-anything」對於靜態嵌套類型非常具有誤導性。 (把一個多餘的單詞'Class'放在一個類的名字裏也是一個壞主意。) –

回答

1

讓我們調整OuterClass代碼有點更有趣的是:擺在InnerClass實例數組中:

private static InnerClass[] innerArr = { new InnerClass() }; 

現在你不能直接引用私有類型InnerClass另一類是試圖通過反射來獲得靜態字段。您可以首先將其稱爲Object的數組。

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類型。

一種方法是使用OuterClass「類對象的declaredClasses屬性:

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])); 
} 
相關問題