public class Demo {
public Demo() { System.out.println("Constructor"); }
public static void main(String[] args) throws Exception {
Class> clazz = Class.forName("Demo");
Demo obj1 = (Demo) clazz.newInstance(); // 反射
Demo obj2 = new Demo(); // 直接 new
}
}
| 維度 | Class.forName().newInstance() | new Demo() |
|---|---|---|
| 類型檢查 | 運行時(弱類型) | 編譯時(強類型) |
| 構造函數 | **只能調用無參構造** | 可調用任意 public 構造 |
| 性能 | 較慢(反射開銷) | 快(直接調用) |
| 解耦程度 | **完全解耦**(類名字符串可配置) | 緊耦合(硬編碼類名) |
| 異常 | 拋出多種受檢異常 | 無受檢異常 |
| 適用場景 | 框架、插件、配置驅動、SPI | 常規業務代碼 |
Class.forName():觸發類加載(載入→鏈接→初始化),返回 Class 對象。newInstance():調用無參構造器創建實例(內部用反射 Constructor.newInstance())。new:直接分配內存、調用構造器、返回引用。Class.newInstance() 已棄用,推薦用 clazz.getDeclaredConstructor().newInstance(),支持拋出異常、訪問私有構造等。
new**,簡單高效類型安全。