我理解为了实例化一个内部类(即非静态),你需要一个封闭类的实例。如果封闭类是抽象的(不要问),这会使事情变得复杂一些。请考虑以下事项。
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);
想象一下,当有效时我会感到惊讶。我的问题是,为什么这样做?这会一直有用吗?
答案 0 :(得分:5)
它起作用,因为构造函数只是设置了Outer.this字段。它可能应该检查它不是空的(因此它快速失败),但如果没有它会更快。
我不会依赖它始终工作,不同的JVM,甚至不同的更新都有可能以不同的方式工作。
根据您之前的示例,这应该有用。
Inner instance = constructor.newInstance(new Outer(){});