java - 通过名称创建内部静态类实例

标签 java instance inner-classes

我需要从每个静态定义的内部类创建实例,但我得到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/

相关文章:

php - self::__construct() 和 new self() 之间的确切区别

java - java中什么时候使用嵌套内部类?

java - 为什么JDK7不允许方法局部内部类访问自己方法的局部变量

java - 当框架中有两个 JPanel 时,在一个 JPanel 上绘画

java - 在 MySql 工作台上创建新连接指定什么值

java - 尝试将对象放入方法时出错

java - 使用 readObject() 反序列化一个类,并将 "subsititute"调用它的实例与 readObject 返回的实例一起使用

java - 派生嵌套类中的静态初始化程序 block

java - Android WebView 在链接单击时不会启动标准浏览器 - shouldOverrideUrlLoading 无效

java - edu.umd.cs.findbugs.annotations 已弃用?我应该为空注释使用什么?