首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 反射獲取陣列類型技巧:Array.newInstance 實作範例

     編輯:Java 相關知識

在反射調用接受陣列參數的方法時,需構造對應的 Class 物件代表陣列類型。本文示範使用 java.lang.reflect.Array.newInstance() 取得陣列 Class,而非建立實例。

問題場景

public class TestReflect {
    public void test(MyString[] args) { ... }
}
// 反射調用 test(MyString[]) 需傳入 MyString[].class

解法:Array.newInstance(Class, int)

import java.lang.reflect.*;

public class TestReflect {
    public static void main(String[] args) throws Exception {
        Class c = Class.forName("TestReflect");

        // 1. 無參方法
        Method m = c.getMethod("test", new Class[]{});
        System.out.println(m);

        // 2. 單一 MyString 參數
        m = c.getMethod("test", new Class[]{MyString.class});
        System.out.println(m);

        // 3. 透過字串載入 MyString 再取得方法
        m = c.getMethod("test", new Class[]{Class.forName("MyString")});
        System.out.println(m);

        // 4. 關鍵:取得 MyString[] 類別
        Class arrayClass = Array.newInstance(Class.forName("MyString"), 1).getClass();
        m = c.getMethod("test", new Class[]{arrayClass});
        System.out.println(m); // 成功解析 test(MyString[])
    }
}

class MyString {
    public MyString(String s) { System.out.println("MyString ctor"); }
}

關鍵點解析

  • Array.newInstance(componentType, length) 回傳 Object (實際為陣列實例)
  • 呼叫 .getClass() 取得 Class 物件,即 MyString[].class
  • length=1 即可,不需建立真實元素
  • 此技巧適用於任意元件類型的陣列反射調用

補充:基本型別陣列

int[].class        == Array.newInstance(int.class, 1).getClass()
double[][].class   == Array.newInstance(double[].class, 1).getClass()

掌握 Array.newInstance 取得陣列 Class,是反射調用陣列參數方法的標準作法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved