按名称创建内部静态 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 需要对其上下文的引用。
我需要从每个静态定义的内部 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 需要对其上下文的引用。