gde*_*ohn 4 java reflection abstract-class instantiation inner-classes
我理解为了实例化一个内部类(即非静态),你需要一个封闭类的实例.如果封闭类是抽象的(不要问),这会使事情变得复杂一些.考虑以下.
abstract class Outer {
class Inner {}
}
Run Code Online (Sandbox Code Playgroud)
Inner例如,实例化仍然可以静态地使用,例如,匿名类,就像这样.
Inner instance = new Outer() {}.new Inner();
Run Code Online (Sandbox Code Playgroud)
但那么如何动态地完成同样的事情Constructor.newInstance呢?(请注意,我动态地说;假设您不知道外部类的名称.)您需要根据JLS 15.9.3传递第一个参数的封闭类的实例,如果有办法的话为了满足抽象参数而动态创建东西,我不知道它(任何想法的奖励积分).
长话短说,我最终意外地传入null,就像这样.
Constructor<Inner> constructor = Inner.class.getDeclaredConstructor(Outer.class);
Object argument = null;
Inner instance = constructor.newInstance(argument);
Run Code Online (Sandbox Code Playgroud)
想象一下,当有效时我会感到惊讶.我的问题是,为什么这样做?这会一直有效吗?
它起作用,因为构造函数只是设置Outer.this字段.它可能应该检查它不是空的(因此它快速失败),但如果没有,它会更快.
我不会依赖它总是工作,有可能不同的JVM,甚至不同的更新将以不同的方式工作.
根据您之前的示例,这应该工作.
Inner instance = constructor.newInstance(new Outer(){});
Run Code Online (Sandbox Code Playgroud)