在反射調用接受陣列參數的方法時,需構造對應的 Class 物件代表陣列類型。本文示範使用 java.lang.reflect.Array.newInstance() 取得陣列 Class,而非建立實例。
public class TestReflect {
public void test(MyString[] args) { ... }
}
// 反射調用 test(MyString[]) 需傳入 MyString[].class
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[].classlength=1 即可,不需建立真實元素int[].class == Array.newInstance(int.class, 1).getClass()
double[][].class == Array.newInstance(double[].class, 1).getClass()
掌握 Array.newInstance 取得陣列 Class,是反射調用陣列參數方法的標準作法。