Java 反思 API。不能实例化内部 Class 如果它不是 public
Java Reflection API. Cant instantiate Inner Class if its not public
请帮我反思api。如果没有 "public" 修饰符,我无法实例化内部 class。
我有 classes:
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();
}
}
Inner class - 是AbstractClass的一个实现。 AbstractClass 在不同的包和 classes 中会有很多这样的实现。
问题是。当内部 classes 具有 public 修饰符时,一切正常。但一定不能是public。当内部 classes 具有 public 修饰符时,我可以使用 innerReal.getConstructors() 获取其构造函数列表。
但是当我们删除 Inner 的 public 修饰符时 - 构造函数列表变为空。反射 api 让我可以通过它的 forName() 方法获得 inner class,但我无法通过构造函数获得它的实例,因为它没有任何实例。
在此先感谢您的帮助! =)
尝试getDeclaredConstructors()
,它可以帮助你。
您忘记将构造函数设置为可访问
这应该有效:
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());
请帮我反思api。如果没有 "public" 修饰符,我无法实例化内部 class。 我有 classes:
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();
}
}
Inner class - 是AbstractClass的一个实现。 AbstractClass 在不同的包和 classes 中会有很多这样的实现。
问题是。当内部 classes 具有 public 修饰符时,一切正常。但一定不能是public。当内部 classes 具有 public 修饰符时,我可以使用 innerReal.getConstructors() 获取其构造函数列表。
但是当我们删除 Inner 的 public 修饰符时 - 构造函数列表变为空。反射 api 让我可以通过它的 forName() 方法获得 inner class,但我无法通过构造函数获得它的实例,因为它没有任何实例。
在此先感谢您的帮助! =)
尝试getDeclaredConstructors()
,它可以帮助你。
您忘记将构造函数设置为可访问
这应该有效:
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());