如何在Java中使用反射获取pirvate内部类实例?

时间:2017-04-18 04:57:38

标签: java reflection

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不起作用是一个私人类。

1 个答案:

答案 0 :(得分: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类型。

一种方法是使用declaredClasses&#39;的OuterClass属性。 class object:

    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]));
}