非静态内部类的构造器
有如下程序
public class Outer{ public static void main(String args[])throws Exception{ new Outer().test(); } public void test()throws Exception{ //创建非静态内部类对象 System.out.println(new Inner()); //使用反射方式创建内部类对象 System.out.println(Inner.class.newInstance()); } public class Inner{ public String toString(){ return "Inner对象"; } } }
我们 发现直接创建的内部类对象完全正常,但是通过反射创建的内部类对象抛出了异常。
我们对内部类进行反编译
我们发现,非静态内部类并没有无参数的构造器,表面上调用Inner的无参数的构造器创建实例,实际上JVM会将this(代表当前默认的Outer对象)作为实参
传入Inner构造器。
这符合非静态内部类的规则:非静态内部类必须寄生在外部类的实例中,没有外部类的对象,就不能产生非静态内部类的对象。因此,非静态内部类不可能有无参数构造器。
当程序通过反射指定调用Inner类无参数的构造器创建对象,导致异常。