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

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(){});

以上是关于动态实例化嵌套在抽象类中的内部类的主要内容,如果未能解决你的问题,请参考以下文章

Java语言简介基础组成封装继承多态抽象类内部类接口

Java语言简介基础组成封装继承多态抽象类内部类接口

《java基础知识》Java内部类及其实例化

Java学习之抽象类

五. 面向对象高级特性1. Java内部类及其实例化

如何避免内部类中的内存泄漏