使用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方法的參數:第一個參數爲該方法名,後面的參數爲原方法中的參數的類類型。