[英]How can I get an instance of non-named inner class by Java reflection?
[英]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.