【问题标题】:Creat inner static class instance by its name [duplicate]按名称创建内部静态类实例[重复]
【发布时间】:2020-03-01 17:05:34
【问题描述】:

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

我在这里缺少什么?

【问题讨论】:

标签: java instance inner-classes


【解决方案1】:

你错过了Class.getName

Class.getCanonicalName 将根据 Java 语言规范返回名称。您需要 JVM/字节码使用的名称。

名称不同是因为 JVM 与 Java 1.0 语言大致匹配。兼容性方法使所有新事物在字节码级别看起来有点像黑客攻击。

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

【讨论】:

  • “根据 Java 语言规范的名称” - 这是误导性的; Java中的各种名称都是“根据JLS”,因为JLS定义了语言。您指的是二进制名称,而不是简单名称规范名称
猜你喜欢
  • 2010-11-13
  • 2019-01-02
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2014-08-21
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多