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

歡迎各位小夥伴補充編程過程中遇到的各種錯誤以及錯誤的解決方法,致力於讓編程更便利,讓錯誤不再成爲煩惱!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章