工具方法 `getArray(Class c, String sql)` 需根據傳入的 `Class` 物件動態建立對應型別陣列(如 `String[]`、`User[]`)。直接 `list.toArray(new Object[size])` 回傳 `Object[]`,**無法強轉為 `String[]` 或具體型別陣列**(會拋 `ClassCastException`)。正解是用 `java.lang.reflect.Array.newInstance`。
public static Object[] getArray(Class c, String str) {
List list = jdbcUtil.getList(c, str); // List<具体Bean>
return list.toArray(new Object[list.size()]); // 回傳 Object[]
}
// 呼叫端
String[] arr = (String[]) getArray(String.class, "sql"); // ❌ ClassCastException
import java.lang.reflect.Array;
import java.util.List;
public static T[] getArray(Class clazz, String sql) {
List list = jdbcUtil.getList(clazz, sql); // 假設已泛型化
// 關鍵:建立 T[] 型別陣列
@SuppressWarnings("unchecked")
T[] array = (T[]) Array.newInstance(clazz, list.size());
return list.toArray(array); // 直接填充到指定型別陣列
}
// 使用
String[] strs = getArray(String.class, "SELECT name FROM users");
User[] users = getArray(User.class, "SELECT * FROM users");
| 方法 | 用途 | 範例 |
|---|---|---|
| `Array.newInstance(Class> componentType, int length)` | 建立一維指定型別陣列 | `String[] arr = (String[]) Array.newInstance(String.class, 10);` |
| `Array.newInstance(Class> componentType, int... dimensions)` | 建立多維陣列 | `int[][] matrix = (int[][]) Array.newInstance(int.class, 3, 4);` |
| `Array.get(Object array, int index)` | 讀取陣列元素 | `Object val = Array.get(arr, 0);` |
| `Array.set(Object array, int index, Object value)` | 設定陣列元素 | `Array.set(arr, 0, "hello");` |
| `Array.getLength(Object array)` | 取得陣列長度 | `int len = Array.getLength(arr);` |
public final class ArrayUtils {
private ArrayUtils() {}
@SuppressWarnings("unchecked")
public static T[] toArray(List list, Class clazz) {
if (list == null) return null;
T[] array = (T[]) Array.newInstance(clazz, list.size());
return list.toArray(array);
}
// 當只有 Class 物件、無泛型資訊時
public static Object newArray(Class> componentType, int length) {
return Array.newInstance(componentType, length);
}
// 複製陣列並改變型別(如 Object[] → String[])
@SuppressWarnings("unchecked")
public static T[] copyOf(Object[] src, Class clazz) {
if (src == null) return null;
T[] dest = (T[]) Array.newInstance(clazz, src.length);
System.arraycopy(src, 0, dest, 0, src.length);
return dest;
}
}
// jdbcUtil.getList 簽名建議泛型化
public List getList(Class clazz, String sql, Object... params) {
// 內部用 BeanPropertyRowMapper / ResultSetMapper 映射
return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(clazz), params);
}
掌握 `Array.newInstance(componentType, length)` 動態建立具體型別陣列,配合 `list.toArray(typedArray)`,即可完美解決反射場景下的陣列型別轉換問題。