[报错信息] : java.lang.NoSuchMethodException: java.lang.Integer.init() - Java反射创建对象出现

一、报错信息

Exception in thread "main" java.lang.InstantiationException: java.lang.Integer
	at java.lang.Class.newInstance(Class.java:427)
	at top.clearlight.coretech.reflect.ReflectTest.main(ReflectTest.java:43)
Caused by: java.lang.NoSuchMethodException: java.lang.Integer.<init>()
	at java.lang.Class.getConstructor0(Class.java:3082)
	at java.lang.Class.newInstance(Class.java:412)
	... 1 more

二、错误代码

Integer integer = Integer.class.newInstance();


三、原因分析

Integer.class返回Class对象

调用newInstance()方法.会调用Integer类的无参构造函数.

报错信息显示java.lang.NoSuchMethodException(没有这样的方法异常) : java.lang.Integer.()(类初始化的原因)

通过查看Integer类的源码,发现并没有无参构造函数.
[报错信息] : java.lang.NoSuchMethodException: java.lang.Integer.init() - Java反射创建对象出现_第1张图片
因此出现java.lang.InstantiationException: java.lang.Integer实例化异常


四、解决方法

Class对象newInstance()方法只能创建无参构造函数的对象,想要创建Integer对象除了可以直接简单的new,这里只是为了解决这个问题.

Integer integer = Integer.class.getConstructor(int.class).newInstance(10);

Note :
getConstructor(Class... parameterTypes)方法只可以创建有public方法修饰的构造方法的对象.

如果构造函数没有修饰符,或者修饰符为private,就需要使用 getDeclaredConstructor(Class... parameterTypes)方法来创建对象

如果修饰符为private,创建对象之前,还需要将反射对象的accessible标志设置为true(Constructor对象.setAccessible(true); ).




对创建对象的详细描述请看 : Java反射 - 通过反射创建有参与无参的对象

你可能感兴趣的:(#,Java基础知识)