动态实例化嵌套在抽象类中的内部类

时间:2010-12-10 10:09:50

标签: java reflection abstract-class instantiation inner-classes

我理解为了实例化一个内部类(即非静态),你需要一个封闭类的实例。如果封闭类是抽象的(不要问),这会使事情变得复杂一些。请考虑以下事项。

abstract class Outer {
   class Inner {}
}

实例化Inner仍然可以静态地使用,例如,匿名类,就像这样。

Inner instance = new Outer() {}.new Inner();

但是如何用Constructor.newInstance动态完成同样的事情呢? (注意我动态地说;假设你不知道外部类的名称。)你需要为JLS 15.9.3传递第一个参数的封闭类的实例,如果有的话为了满足抽象参数而动态创建的方法,我不知道它(任何想法的奖励积分)。

长话短说,我最终意外地传递了null,就像这样。

Constructor<Inner> constructor = Inner.class.getDeclaredConstructor(Outer.class);
Object argument = null;
Inner instance = constructor.newInstance(argument);

想象一下,当有效时我会感到惊讶。我的问题是,为什么这样做?这会一直有用吗?

1 个答案:

答案 0 :(得分:5)

它起作用,因为构造函数只是设置了Outer.this字段。它可能应该检查它不是空的(因此它快速失败),但如果没有它会更快。

我不会依赖它始终工作,不同的JVM,甚至不同的更新都有可能以不同的方式工作。

根据您之前的示例,这应该有用。

Inner instance = constructor.newInstance(new Outer(){});