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

Java 动态实例化嵌套在抽象类中的内部类,java,reflection,abstract-class,instantiation,inner-classes,Java,Reflection,Abstract Class,Instantiation,Inner Classes,我知道要实例化一个内部类(即非静态类),您需要一个封闭类的实例。如果封闭类是抽象的(不要问),这会使事情变得更加复杂。请考虑以下内容: abstract class Outer { class Inner {} } 实例化内部在静态上仍然是可行的,例如,使用匿名类,如下所示 Inner instance = new Outer() {}.new Inner(); Constructor<Inner> constructor = Inner.class.getDeclared

我知道要实例化一个内部类(即非静态类),您需要一个封闭类的实例。如果封闭类是抽象的(不要问),这会使事情变得更加复杂。请考虑以下内容:

abstract class Outer {
   class Inner {}
}
实例化
内部
在静态上仍然是可行的,例如,使用匿名类,如下所示

Inner instance = new Outer() {}.new Inner();
Constructor<Inner> constructor = Inner.class.getDeclaredConstructor(Outer.class);
Object argument = null;
Inner instance = constructor.newInstance(argument);
那么,如何使用
构造函数.newInstance
动态地完成同样的事情呢?(请注意,我说的是动态的;假设您不知道外部类的名称。)您需要为第一个参数传递一个封闭类的实例,如所示,如果有一种方法可以动态创建一些东西来满足抽象参数,我不知道(这里的任何想法都有好处)

长话短说,我最终意外地传入了
null
,如下所示

Inner instance = new Outer() {}.new Inner();
Constructor<Inner> constructor = Inner.class.getDeclaredConstructor(Outer.class);
Object argument = null;
Inner instance = constructor.newInstance(argument);
Constructor=internal.class.getDeclaredConstructor(Outer.class);
对象参数=null;
内部实例=构造函数.newInstance(参数);

想象一下,当这起作用时,我的惊讶。我的问题是,为什么会这样?这会一直起作用吗?

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

我不会指望它总是工作的,不同的JVM,甚至不同的更新都有可能工作得不同

根据前面的示例,这应该是可行的

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

因此,如果调用了
内部
中的一个方法,该方法尝试取消对
外部的引用。这
,会导致
空点异常
,还是什么?如果它尝试使用它,它会失败。您仍然可以测试它,并以与任何空字段相同的方式使用它。只是你可能没想到会是这样。等我睡一觉,我要测试一下。明天我看了你的答案后,可能会接受。谢谢至于传入
newouter(){}
,只有知道
Outer
时才有效。我想在外部世界提供一个任意的
对象的情况下做到这一点。所以,我看了一下,收集了一些有用的花边新闻。我以前不明白,内部类在编译后会与它们的封闭类完全分离,唯一的链接是引用封闭实例的实例字段,该实例必须传递给内部类构造函数。现在我明白了,这就更有意义了。再次感谢您的回答。顺便说一句:如果可能的话,最好是通过使内部类成为“静态”的嵌套类来提高性能并减少外部类和内部类之间不必要的依赖关系。“不要问”-尽量不要问…@BertF Ha。如果你一定要知道,我正在写一个方法,试图在尽最大努力的基础上实例化一个给定的类,我想处理所有可能的情况。嵌套在抽象类中的内部类就是这样一种可能的情况。非常有意义-谢谢!