gpt4 book ai didi

Java 反射 API。如果内部类不是公共(public)的,则无法实例化内部类

转载 作者:行者123 更新时间:2023-11-30 03:12:45 25 4
gpt4 key购买 nike

请帮助我反射 api。如果内部类没有“public”修饰符,我无法实例化它。我有课:

public abstract class AbstractClass {
String str;
public AbstractClass (String str) {
this.str = str;
}
abstract void process(String str);
}

public class Outer {  

class Inner extends AbstractClass{
Inner(String str) {
super(str);
}

@Override
void process(String str) {
//doSmth
}
}
}

我在另一个地方有这样的方法:

void fillArray (AbstractClass innerAbstract) {
try {
ArrayList<AbstractClass> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Object outerClazz = Class.forName(innerAbstract.getClass().getEnclosingClass().getName()).newInstance();
Class<?> innerReal = Class.forName(innerAbstract.getClass().getName());
Constructor<?> ctor = innerReal.getConstructor(outerClazz.getClass(), String.class);
AbstractClass resultClass = (AbstractClass) ctor.newInstance(outerClazz, innerReal.getName());
list.add(resultClass);
resultClass.process("STR");
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException |
NoSuchMethodException | SecurityException | IllegalArgumentException |
InvocationTargetException ex) {
ex.printStackTrace();
}

}

内部类 - 是 AbstractClass 的实现。 AbstractClass在不同的包和类中会有很多这样的实现。

问题是。当内部类具有 public 修饰符时,一切都可以正常工作。但一定不能公开。当内部类具有 public 修饰符时,我可以使用 innerReal.getConstructors() 获取其构造函数的列表。

但是当我们删除 Inner 的 public 修饰符时 - 构造函数列表变为空。 Reflection api 允许我使用其 forName() 方法获取内部类,但我无法使用构造函数获取其实例,因为它没有任何实例。

预先感谢您的帮助! =)

最佳答案

您忘记将构造函数设置为可访问

这应该有效:

Constructor<?> ctor = innerReal.getConstructor(outerClazz.getClass(), String.class);
ctor.setAccessible(true); // can throw some sort of Exception
AbstractClass resultClass = (AbstractClass) ctor.newInstance(outerClazz, innerReal.getName());

关于Java 反射 API。如果内部类不是公共(public)的,则无法实例化内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33280137/

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