繁体   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