如何在Java中获得具有反射的pirvate内部类实例?

如何在Java中获得具有反射的pirvate内部类实例?,java,reflection,Java,Reflection,需要使用Java中的反射获取innerArr值 public class OuterClass { private static class InnerClass { public int id = 0; } private static InnerClass[] innerArr; } ClassLoader=Thread.currentThread().getContextClassLoader(); Class cla=loader.loadCla

需要使用Java中的反射获取innerArr值

public class OuterClass {
    private static class InnerClass {
        public int id = 0;
    }
    private static InnerClass[] innerArr;
}
ClassLoader=Thread.currentThread().getContextClassLoader();
Class cla=loader.loadClass(“OuterClass”);
字段innerArrRef=cla.getDeclaredField(“innerArr”);
innerArrRef.setAccessible(真);
OuterClass.InnerClass[]innerArrValue=(OuterClass.InnerClass[])innerArrRef.get(cla);

上面的代码不适用于InnerClass是一个私有类。

让我们稍微调整一下您的
OuterClass
代码,使其更有趣:在数组中放入
InnerClass
的实例:

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
。您可以首先将其称为对象数组

private static InnerClass[] innerArr = { new InnerClass() };
但是,如果有多个成员类,则需要遍历数组并搜索正确的成员类。另一种方法是利用javac将为您的InnerClass提供一个完全限定的类型名的知识,该名称类似于
mypackage.OuterClass$InnerClass

    Class<?> inner = cla.getDeclaredClasses()[0];

将您尝试过的内容发布为,并描述您遇到的问题。将
InnerClass
命名为声明的
private static class InnerClass
成员类型是一个不好的主意,因为根据Java中的定义,内部类是一个未声明的
static
成员类。这使得名称“
internal
-anything”对于静态嵌套类型非常容易产生误导。(这是​ 在类的名称中添加多余的单词
Class
,也是一个坏主意。)
    Class<?> inner = cla.getDeclaredClasses()[0];
    Class<?> inner = cla.getClassLoader().loadClass(cla.getName() + "$InnerClass");
    Field id = inner.getField("id");
    System.out.println("Inner id: " + id.getInt(innerArrValue[0]));
}