首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 反射 getConstructors() 拋出 ArrayIndexOutOfBoundsException 原因

     編輯:程式設計疑難解答

錯誤代碼

Class clazz = Class.forName("StudyOne.students");
Constructor[] cons = clazz.getConstructors();
students s = (students) cons[0].newInstance("張三", 30); // 拋出 ArrayIndexOutOfBoundsException: 0

原因

  1. 類無公共構造器:students 類只定義了私有字段與 getter/setter,**未顯式定義任何構造器**,編譯器生成的**默認構造器為 package-private(無修飾符)**,getConstructors() 僅返回 **public** 構造器,數組長度為 0。
  2. 包名/類名不規範:包名應全小寫,類名首字母大寫。

修正代碼

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)。
  • 反射實例化首選有參構造器,避免默認構造器不存在問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved