Class 類三種獲取方式
// 1. 類字面量(編譯期已知)
Class cls1 = Phone.class;
// 2. 對象實例(運行期)
Phone p = new Phone();
Class> cls2 = p.getClass();
// 3. 字符串全限定名(動態加載)
Class> cls3 = Class.forName("com.example.Phone");
反射實例化對象
public class Phone {
public Phone() { System.out.println("構造方法"); }
@Override public String toString() { return "一部手機"; }
}
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Class cls = Phone.class;
Phone phone = cls.getDeclaredConstructor().newInstance(); // 推薦 JDK 9+
// 或 phone = cls.newInstance(); // 已棄用,僅調用 public 無參構造
System.out.println(phone);
}
}
關鍵 API 速查
getDeclaredConstructor(paramTypes):獲取任意權限構造,需 setAccessible(true)。
getMethod(name, paramTypes) / getDeclaredMethod:獲取方法對象。
getField / getDeclaredField:訪問字段,set(obj, value) 賦值。
getAnnotations():讀取註解元數據。
應用場景
- 框架通用組件(Spring IOC、MyBatis Mapper 掃描)。
- 動態代理、插件熱載入。
- 序列化/反序列化庫(Jackson、Gson)。