2017-04-18 47 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])); 
} 
相关问题