如何在Java中用反射实例化内部类?

Ste*_*han 62 java reflection instantiationexception

我尝试实例化以下Java代码中定义的内部类:

 public class Mother {
      public class Child {
          public void doStuff() {
              // ...
          }
      }
 }
Run Code Online (Sandbox Code Playgroud)

当我试图像这样得到一个Child的实例

 Class<?> clazz= Class.forName("com.mycompany.Mother$Child");
 Child c = clazz.newInstance();
Run Code Online (Sandbox Code Playgroud)

我得到这个例外:

 java.lang.InstantiationException: com.mycompany.Mother$Child
    at java.lang.Class.newInstance0(Class.java:340)
    at java.lang.Class.newInstance(Class.java:308)
    ...
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Jon*_*eet 116

还有一个额外的"隐藏"参数,它是封闭类的实例.您需要使用构造函数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);
Run Code Online (Sandbox Code Playgroud)

编辑:或者,如果嵌套类实际上不需要引用封闭的实例,请改为使用嵌套的静态类:

public class Mother {
     public static class Child {
          public void doStuff() {
              // ...
          }
     }
}
Run Code Online (Sandbox Code Playgroud)

  • 只是额外的一点是,如果内部类不是公共的,你需要调用`ctor.setAccessible(true)`以使它工作! (6认同)
  • 我认为真正的问题是OP并不意味着该类从一开始就不是静态的,但我可能会误会 (2认同)