一.静态内部类
1.正常创建new
Outer.InnerA a = new Outer.InnerA();
2.反射创建
Outer.InnerA a = InnerA.class.newInstance();
二.非静态内部类
1.正常创建new
InnnerB b = new Outer().new InnnerB();
2.反射创建
InnnerB b = InnnerB.class.newInstance();
这样会抛出异常:
java.lang.InstantiationException: com.common.reflect.Outer$InnnerB
at java.lang.Class.newInstance(Class.java:427)
at com.common.reflect.ReflectUtilTest.main(ReflectUtilTest.java:13)
Caused by: java.lang.NoSuchMethodException: com.common.reflect.Outer$InnnerB.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)
... 1 more
由于非静态内部类创建依赖于外部类的对象,所以反射创建也需要一个外部类的实例
InnnerB b = (InnnerB) InnnerB.class.getDeclaredConstructors()[0].newInstance(Outer.class.newInstance());
这样newInstance可以传入参数,这里的外部类实例可以采取new的方式,按需选择即可
package com.common.reflect;
public class Outer {
public static class InnerA {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class InnnerB {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}