动态实例化嵌套在抽象类中的内部类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态实例化嵌套在抽象类中的内部类相关的知识,希望对你有一定的参考价值。
我理解为了实例化一个内部类(即非静态),你需要一个封闭类的实例。如果封闭类是抽象的(不要问),这会使事情变得复杂一些。考虑以下。
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);
想象一下,当有效时我会感到惊讶。我的问题是,为什么这样做?这会一直有效吗?
答案
它起作用,因为构造函数只是设置Outer.this字段。它可能应该检查它不是空的(因此它快速失败),但如果它没有,它会更快。
我不会依赖它总是工作,有可能不同的JVM,甚至不同的更新将以不同的方式工作。
根据您之前的示例,这应该工作。
Inner instance = constructor.newInstance(new Outer(){});
以上是关于动态实例化嵌套在抽象类中的内部类的主要内容,如果未能解决你的问题,请参考以下文章