使用Java反射机制时出现java.lang.InstantiationException:异常
使用Java的反射机制,调用类中的某个方法时,结果出现java.lang.InstantiationException:的异常。完整异常日志如下:
java.lang.InstantiationException: com.tyf.reflect.Student
at java.lang.Class.newInstance(Class.java:427)
at com.tyf.reflect.Student.main(Student.java:31)
Caused by: java.lang.NoSuchMethodException: com.tyf.reflect.Student.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)
... 1 more
下面再贴出我的完整代码:
package com.tyf.reflect;
import java.lang.reflect.Method;
/*
*@Author:yafeng
*@Date:2019/10/11
*@Time:21:24
* Java反射入门
*/
public class Student {
String name;
String gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Student(String name, String gender) {
this.name = name;
this.gender = gender;
}
public static void main(String[] args) {
try{
Class c = Student.class;
Object o = c.newInstance();//初始化一个实例
Method method_setName = c.getDeclaredMethod("setName", String.class);
Method method_getName = c.getDeclaredMethod("getName");
method_setName.invoke(o,"yafneg");
Object name = method_getName.invoke(o);
System.out.println(name);
}catch (Exception e){
e.printStackTrace();
}
}
}
我的代码的意图是通过反射来获取类中的setName()和getName()方法,结果一直报异常,异常位置未31行,即newInstance(),实例化时出现错误。当时还不接为什么这里还会出错?想了想还真是这样,因为你在这里实例化对象就相当于普通的new一个对象,由于我在类中实现了带参数的构造器,覆盖了原有默认的不带参数的构造器,因此不带参数的实例化对象自然会报错。
解决办法有两个:
- 再手动添加一个不带参的构造器;
- 在用newInstance()实例化对象时,带参数。
到这里问题得以解决,至于NoSuchMethodException即没该方法异常是由于前者实例化对象时引起的异常的连带异常,解决上述异常后,该异常自然解决。若仅发生了NoSuchMethodException异常,很大可能是因为getDeclaredMethod()的参数有问题,getDeclaredMethod方法的参数:第一个参数为该方法名,后面的参数为原方法中的参数的类类型。