按名称创建内部静态 class 实例

Creat inner static class instance by its name

我需要从每个静态定义的内部 classes 创建实例,但我得到 java.lang.ClassNotFoundException.

首先,我收集声明的内部 classes:

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 是外部 class.

其次,我对给定的内部 class 名称进行 class 加载和实例化:

public Object createObjectByClassName(String p_className)
        throws ClassNotFoundException, IllegalAccessException, InstantiationException {
    Class<?> clazz = Class.forName(p_className);
    return clazz.newInstance();
}

此内部 class 名称的格式为:PACKAGE.OUTER_CLASS_NAME. INNER_CLASS_NAME.

我在这里缺少什么?

你错过了 Class.getName.

Class.getCanonicalName 将根据 Java 语言规范 return 名称。您想要 JVM/bytecode 正在使用的名称。

名称不同是因为 JVM 与 Java 1.0 语言大致匹配。兼容性的方法使所有新的东西在字节码级别看起来有点像 hack。

此外,构造函数可能不同,因为内部 class 需要对其上下文的引用。