在面向物件世界裡,「類也是物件」,是 java.lang.Class 的實例。一個類在 JVM 中只對應一個 Class 物件。
Foo foo = new Foo();
// 1. 類字面量 —— 編譯期已知類型
Class> c1 = Foo.class;
// 2. 實例 getClass() —— 運行期持有實例
Class> c2 = foo.getClass();
// 3. 全限定名動態載入 —— 字串形式,需處理異常
Class> c3 = null;
try {
c3 = Class.forName("com.tsh.reflect.Foo");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 驗證單例特性
System.out.println(c1 == c2); // true
try {
// 需類有 public 無參構造器
Foo foo2 = (Foo) c1.newInstance();
foo2.print();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
Class.forName("com.mysql.jdbc.Driver"))掌握 Class 獲取與實例化是反射開發的入門基石。