首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Java Class.forName().newInstance() vs new:反射實例化與直接實例化的區別與選擇指南

     編輯:關於C++

代碼示例


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:直接分配內存、調用構造器、返回引用。

Java 9+ 棄用提示

Class.newInstance() 已棄用,推薦用 clazz.getDeclaredConstructor().newInstance(),支持拋出異常、訪問私有構造等。

最佳實踐

  1. **默認用 new**,簡單高效類型安全。
  2. 需**動態加載類**(如插件系統、JDBC 驅動、工廠模式配置類名)時用反射。
  3. 反射代碼集中封裝在工廠類中,業務層面向接口編程。
  4. 避免在熱路徑(高頻調用)使用反射實例化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved