摘自:《Java解惑》谜题80:更深层的反射
首先,看一段程序:
它的输出会是什么呢?
结果是:
Exception in thread "main" java.lang.InstantiationException: test.Outer$Inner
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at test.Outer.greet(Outer.java:25)
at test.Outer.main(Outer.java:35)
2、Inner实例并不需要一个外围的Outer实例,所以可以将Inner类型声明为静态的。除非你确实是需要一个外围实例,否则你应该优先使用静态成员类而不是非静态成员类。
3、考虑到从Java程序到class文件的映射的复杂度,请避免使用发射来实例化内部类。
修正办法:
1、直接创建对象,而不是使用Class.newInstance。例如:
Inner inner = new Inner();
System.out.println(inner);
2、使用java.lang.reflect.Constructor。
Constructor c = Inner.class.getConstructor(Outer.class);
System.out.println(c.newInstance(this));
3、将Inner声明为静态成员类。
public static class Inner{...}