为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥9229398 2019-08-13 10:28:38
如何在Java中用反射实例化内部类?我尝试实例化以下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 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

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

              // ...

          }

     }

}


查看完整回答
反对 回复 2019-08-13
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

此代码创建内部类实例。

  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});


查看完整回答
反对 回复 2019-08-13
  • 2 回答
  • 0 关注
  • 851 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信