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

时间:2013-07-05 09:15:56

标签: java reflection instantiationexception

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

 public class Mother {
      public class Child {
          public void doStuff() {
              // ...
          }
      }
 }

当我尝试像这样获得Child的实例时

 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)
    ...

我错过了什么?

2 个答案:

答案 0 :(得分:109)

还有一个额外的“隐藏”参数,它是封闭类的实例。您需要使用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);

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

public class Mother {
     public static class Child {
          public void doStuff() {
              // ...
          }
     }
}

答案 1 :(得分:-1)

此代码创建内部类实例。

echo json_encode(['result' => $success ? $file : 'Unable to save the file.'])