| 類 | 作用 | 常用方法 |
|---|---|---|
Class<?> | 類的運行時元數據入口 | getFields()、getDeclaredFields()、newInstance() |
Field | 代表類的成員變量(含私有) | setAccessible(true)、get(obj)、set(obj, val) |
Method | 代表類的方法 | invoke(obj, args...) |
class Book {
public String title;
public int length = 0;
public ArrayList<Page> pages = null;
@Override public String toString() {
return "Book:\n title=" + title + "\n length=" + length + "\n pages=" + pages;
}
}
class Page { @Override public String toString() { return " page\n"; } }
Book book = new Book();
Class<?> clazz = book.getClass();
Field f = clazz.getField("length"); // 僅能獲取 public 字段
f.setInt(book, 9); // 直接按類型寫入
System.out.println(book); // length=9
Book book = new Book();
for (Field f : book.getClass().getFields()) {
f.setAccessible(true); // 允許訪問私有/受保護(此處 public 可省略)
if (f.getType() == String.class) {
f.set(book, "格林童話");
} else if (f.getType() == int.class) {
f.set(book, 199);
}
}
// 結果:title=格林童話, length=199
挑戰:pages 是 ArrayList<Page>,運行時泛型擦除,但可通過 getGenericType() 獲取 ParameterizedType 解析實際類型參數。
Book book = new Book();
Field f = book.getClass().getField("pages");
f.setAccessible(true);
// 1. 解析泛型類型:ArrayList → Page.class
ParameterizedType pt = (ParameterizedType) f.getGenericType();
Class<?> elementClass = (Class<?>) pt.getActualTypeArguments()[0]; // Page.class
// 2. 實例化元素並裝入 List
Object pageInstance = elementClass.getDeclaredConstructor().newInstance();
List<Object> list = new ArrayList<>();
list.add(pageInstance);
// 3. 寫入字段
f.set(book, list);
System.out.println(book); // pages=[page]
getGenericType() 獲取。clazz.getConstructor(Types...).newInstance(args...)。Field/Method 對象。module-info.java 中 opens 或命令行 --add-opens。setAccessible 可能拋出 InaccessibleObjectException。