如何使用反射创建内部类对象?内部和外部类均具有不带参数的默认构造函数
Outer class { Inner class{ } public void createO() { Outer.Inner ob = new Inner ();//that works Inner.class.newInstance(); //<--why does this not compile? } }
“如果构造函数的声明类是非静态上下文中的内部类,则构造函数的第一个参数必须是封闭的实例;请参见 Java™语言规范的 15.9.3节。”
这意味着您永远不能使用Class.newInstance; 构造内部类。相反,您必须使用带有单个Outer实例的构造函数。这是一些示例代码,演示其用法:
Class.newInstance
Outer
class Outer { class Inner { @Override public String toString() { return String.format("#<Inner[%h] outer=%s>", this, Outer.this); } } @Override public String toString() { return String.format("#<Outer[%h]>", this); } public Inner newInner() { return new Inner(); } public Inner newInnerReflect() throws Exception { return Inner.class.getDeclaredConstructor(Outer.class).newInstance(this); } public static void main(String[] args) throws Exception { Outer outer = new Outer(); System.out.println(outer); System.out.println(outer.newInner()); System.out.println(outer.newInnerReflect()); System.out.println(outer.new Inner()); System.out.println(Inner.class.getDeclaredConstructor(Outer.class).newInstance(outer)); } }
(请注意,在标准Java术语中, 内部类 始终是非静态的。静态成员类称为 嵌套类 。)