1.newInstance()是通过无参构造函数实例化的,如果无参构造函数不存在,在通过反射获得对象会抛出 java.lang.InstantiationException 异常
2.通过newInstance()获取内部类实例时,下面的代码会出错
public class Test {
class Toy {
Toy() {
}
Toy(int i) {
}
}
public static void main(String[] args) {
try {
Object obj=Class.forName("Test$Toy").newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
输出
java.lang.InstantiationException: Test$Toy
at java.lang.Class.newInstance(Class.java:427)
at Test.main(Test.java:17)
Caused by: java.lang.NoSuchMethodException: Test$Toy.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)
... 1 more
这是因为newInstance()找不到Toy的构造函数。使用下面的代码即可解决此错误
public class Test {
class Toy {
Toy() {
}
Toy(int i) {
}
}
public static void main(String[] args) {
try {
Object obj=Class.forName("Test$Toy").getDeclaredConstructors()[0].newInstance(new Test());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}