当前位置: 首页 > 知识库问答 >
问题:

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

贺子昂
2023-03-14

我尝试实例化以下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)
    ...

我错过了什么?

共有1个答案

罗伟兆
2023-03-14

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

Edit:或者,如果嵌套类实际上不需要引用封闭实例,则将其改为嵌套静态类:

public class Mother {
     public static class Child {
          public void doStuff() {
              // ...
          }
     }
}
 类似资料:
  • 问题内容: 是否可以使用Java反射从另一个类实例化私有内部类。例如,如果我采用了这段代码 是否可以实例化并从main类中的main方法获得对Test的访问。 问题答案: 使用反射时,您会发现该内部类的构造函数将外部类的实例作为附加参数(总是第一个)。 例:

  • 是否可以从类main中的main方法实例化并获得对Test的访问。

  • 我不能创建B-Object,但为什么呢? 例外情况是:

  • 问题内容: 假设您有一个文本文件,例如: 您希望相应地更新相应的对象: 凡是不同种类的枚举。 我想有一个通用的方法来实例化枚举值。也就是说,在运行时使用反射,而无需事先知道对象的枚举类型。 我会想到这样的事情: 问题是:应该有什么呢?给定其String表示形式,甚至可以实例化未知枚举吗? 问题答案: 之后不应该被调用-它返回实例的类 你可以投,避免一般性的问题,因为你已经知道的是

  • 本文向大家介绍java中如何反射获取一个类,包括了java中如何反射获取一个类的使用技巧和注意事项,需要的朋友参考一下 反射说白了就是可以获得一个类的所有信息,主要包括方法和属性两部分。 1.获得方法包括获得方法的名称,方法的返回类型,方法的访问修饰符,以及通过反射执行这个方法。 2.获得属性包括属性的名称,类型,访问修饰符,以及这个属性的值。 这些获得都有相应的API提供操作。 代码如下: 以上

  • 请在反射API方面帮助我。如果内部类没有“public”修饰符,我就不能实例化它。我有课: