我尝试实例下面的Java代码中定义的内部类:
public class Mother {
public class Child {
public void doStuff() {
// ...
}
}
}
当我尝试得到这样子的一个实例
Class<?> clazz= Class.forName("com.mycompany.Mother$Child");
Child c = clazz.newInstance();
我得到这个异常:
java.lang.InstantiationException: com.mycompany.Mother$Child
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
...
我在想什么?
有一个额外的“隐藏”的参数,这是封闭类的实例。 你需要使用在构造函数来获得Class.getDeclaredConstructor
然后提供外围类的一个实例作为参数。 例如:
// All exception handling omitted!
Class<?> enclosingClass = Class.forName("com.mycompany.Mother");
Object enclosingInstance = enclosingClass.newInstance();
Class<?> innerClass = Class.forName("com.mycompany.Mother$Child");
Constructor<?> ctor = innerClass.getDeclaredConstructor(enclosingClass);
Object innerInstance = ctor.newInstance(enclosingInstance);
编辑:另外,如果嵌套类实际上并不需要参考一个类实例,使之成为嵌套静态类来代替:
public class Mother {
public static class Child {
public void doStuff() {
// ...
}
}
}
此代码创建内部类实例。
Class childClass = Child.class;
String motherClassName = childClass.getCanonicalName().subSequence(0, childClass.getCanonicalName().length() - childClass.getSimpleName().length() - 1).toString();
Class motherClassType = Class.forName(motherClassName) ;
Mother mother = motherClassType.newInstance()
Child child = childClass.getConstructor(new Class[]{motherClassType}).newInstance(new Object[]{mother});