錯誤代碼
Class clazz = Class.forName("StudyOne.students");
Constructor[] cons = clazz.getConstructors();
students s = (students) cons[0].newInstance("張三", 30); // 拋出 ArrayIndexOutOfBoundsException: 0
原因
- 類無公共構造器:
students 類只定義了私有字段與 getter/setter,**未顯式定義任何構造器**,編譯器生成的**默認構造器為 package-private(無修飾符)**,getConstructors() 僅返回 **public** 構造器,數組長度為 0。
- 包名/類名不規範:包名應全小寫,類名首字母大寫。
修正代碼
package com.example.reflect;
import java.lang.reflect.Constructor;
public class Student { // 類名大寫
private String name;
private int age;
public Student(String name, int age) { // 顯式 public 構造器
this.name = name;
this.age = age;
}
// getter/setter/toString 省略
}
public class TestReflect {
public static void main(String[] args) throws Exception {
Class> clazz = Class.forName("com.example.reflect.Student");
Constructor>[] cons = clazz.getConstructors(); // 現在長度為 1
Student s = (Student) cons[0].newInstance("張三", 30);
System.out.println(s);
}
}
補充
- 若需獲取所有構造器(含私有),用
getDeclaredConstructors() 並調用 setAccessible(true)。
- 反射實例化首選有參構造器,避免默認構造器不存在問題。