gpt4 book ai didi

java - Java中如何通过反射获取私有(private)内部类实例?

转载 作者:行者123 更新时间:2023-12-02 13:23:51 27 4
gpt4 key购买 nike

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 是私有(private)类。

最佳答案

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

private static InnerClass[] innerArr = { new InnerClass() };

现在,您无法直接引用另一个尝试使用反射获取静态字段的类中的私有(private)类型 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 类型。

一种方法是使用 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]));
}

关于java - Java中如何通过反射获取私有(private)内部类实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43463861/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com