首頁  >  文章  >  Java  >  Item 喜歡介面而不是反射

Item 喜歡介面而不是反射

Barbara Streisand
Barbara Streisand原創
2024-10-25 07:51:02578瀏覽

Java 中的反射 (java.lang.reflect):
透過反思,有可能:

  • 以程式設計方式存取任意類別的建構子、方法和欄位。
  • 以反射方式操作類別及其成員(建構子、方法、欄位),讓您可以建立實例、呼叫方法和存取欄位。
  • 即使類別在編譯期間不存在,也可以呼叫物件的方法。

反射的缺點:
編譯時類型檢查遺失:

  • 通常在編譯時偵測到的錯誤只會在執行時出現。
  • 範例:反射呼叫不存在或不可存取的方法可能會在執行時產生異常。

繁瑣的程式碼:
反射需要更複雜且可讀性較差的程式碼。
例:

Method method = obj.getClass().getMethod("methodName");
method.invoke(obj, args);

表現不佳:

  • 反射方法呼叫比普通呼叫慢得多。
  • 範例:在某些場景下,反射可能比直接方法呼叫慢 11 倍。

反射的應用:

  • 用於程式碼分析工具、依賴注入框架和服務提供框架。
  • 即使在這些情況下,由於其缺點,也應盡可能避免。

有限使用反射:
建議技術:僅使用反射在編譯時實例化未知類,並透過已知介面或超類來引用這些實例。

範例:
建立 Set 實例的程序,由命令列指定:

Class<? extends Set<String>> cl = (Class<? extends Set<String>>) Class.forName(args[0]);
Constructor<? extends Set<String>> cons = cl.getDeclaredConstructor();
Set<String> s = cons.newInstance();
for (int i = 1; i < args.length; i++) {
    s.add(args[i]);
}
System.out.println(s);

範例中說明的缺點:
運行時異常:

  • 此範例在運行時最多可以產生六個不同的異常。
  • 如果不使用反射,這些異常將在編譯時被捕獲。

複雜性與冗長:

  • 此範例需要 25 行程式碼才能從名稱實例化一個類,而直接呼叫建構函式只需一行程式碼即可完成。

未經驗證的演員警告:

  • 在範例中,存在未檢查強制轉換的合法警告,因為命令列上指定的類別可能不是 Set 的實作。

反射的合法使用:

  • 動態依賴:當類別、方法或欄位在執行時可能不存在時。
  • 範例:您可以使用反射來支援套件的多個版本,而不會破壞向後相容性。

結論:
反射很強大,但它也有很多缺點。
只要有可能,僅使用反射來實例化物件並透過編譯時已知的介面或超類別存取它們。

書中的範例:
Item  Dê preferência às interfaces em vez da reflexão

以上是Item 喜歡介面而不是反射的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn