我需要从每个静态定义的内部类创建实例,但我得到java.lang.ClassNotFoundException。
首先,我收集声明的内部类:
public String[] getInnerClassNames(Class<?> p_class) {
Class<?>[] declaredClasses = p_class.getDeclaredClasses();
String[] innerClassNames = new String[declaredClasses.length];
for (int i = 0; i < declaredClasses.length; i++) {
innerClassNames[i] = declaredClasses[i].getCanonicalName();
}
return innerClassNames;
}
其中p_class是外部类。
其次,我对给定的内部类名称进行类加载和实例化:
public Object createObjectByClassName(String p_className)
throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Class<?> clazz = Class.forName(p_className);
return clazz.newInstance();
}
此内部类名称的格式为:PACKAGE.OUTER_CLASS_NAME.INNER_CLASS_NAME。
我在这里缺少什么?
最佳答案
您缺少Class.getName
。
Class.getCanonicalName
将根据 Java 语言规范返回名称。您需要 JVM/字节码正在使用的名称。
名称有所不同,因为 JVM 大致匹配 Java 1.0 语言。兼容性方法使所有新内容看起来都像是字节码级别的黑客攻击。
此外,构造函数很可能不同,因为内部类需要对其上下文的引用。
关于java - 通过名称创建内部静态类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60477562/