2010-01-20 172 views
3

我開始知道,使用反射我們可以創建對象而不使用「新」關鍵字。所以我想知道他們是否有任何差異或使用Reflection的特定場景。因爲直到現在我沒有創建或看到任何代碼創建與反射的對象。使用「新」關鍵字創建的對象並使用反射創建對象

爲什麼使用'新'變得如此使用和反思沒有。

回答

9

只有在想要基於名稱(字符串)或在編譯時無法訪問的類型(例如插件)實例化類型時,纔會使用反射。你不想用它來代替new在正常情況下實例化類型。

+1

我甚至會說,避免在任何其他時間使用它。它會造成不必要的混淆和脆弱。 – 2010-01-20 20:21:45

+0

@亞歷克斯:確實。他們沒有真正的可比性。意味着做不同的事情。 – 2010-01-20 20:24:43

2

反射通常比簡單的代碼慢得多,使用起來更繁瑣。它不是普通代碼的替代品(如新運算符),而是常規代碼無法使用的情況的替代方法。

1

Mehrdad是正確的。在需要在運行時而不是編譯時執行某些操作時使用反射。也許你需要執行的方法直到運行時才知道,或者對象類型不是。插件就是一個很好的例子。

反射會帶來性能下降,這就是爲什麼您應該嘗試將其限制爲僅適用於不適合您的情況。

3

爲什麼使用'new'變得如此使用,並且反射不到。

與「新」關鍵字相比,使用反射是很多工作;它也導致較少可讀的代碼。

當出於某種原因,實例化對象的代碼無法知道該對象的具體類型時,會使用反射。反射廣泛用於creational design patterns

0

對於一個更加真實世界的例子,在春季框架中這種用法很多。我們將在xml中定義對象及其協作類的依賴項,並且容器實際上將使用反射來創建它們的實例,甚至使用反射調用生命週期方法並移交創建的對象。這是您將使用的一種典型場景。此外,如果您查看大多數BRMS解決方案,它們會使用反射來在運行時使用反射來觸發業務規則方法。儘管每天使用反射創建對象的真實世界都很少,但使用JDBC(Class.forName(「driver class」))時,使用某種反射的另一個地方是其他地方。

1

假設你想用一個構造函數,採用String類型的單個參數來實例化類MyObject。與new

MyObject myObject = new MyObject("constructor-arg1"); 

與反射:

Constructor constructor = MyObject.class.getConstructor(String.class); 

MyObject myObject = (MyObject) constructor.newInstance("constructor-arg1"); 

(例如,從http://tutorials.jenkov.com/java-reflection/constructors.html被盜)

應當清楚比前者既更可讀的和更快的鍵入。此外,反思往往痛苦緩慢。另一方面,反射允許在編譯時不需要知道類就可以實例化對象。

總之,只有在沒有其他選擇時才使用反射...

1

贊成的new

  1. 它比反射快得多。
  2. 它導致更簡潔的代碼,這更容易維護。
  3. 反射不是類型安全的。
  4. 由於#3,具有重構支持的IDE(如Eclipse)無法很好地處理反射。

贊成反思:

  1. 這是當你不知道你想在編譯時將類實例的類型的唯一選擇。

所以,你可以看到,new是你想要在99%的情況下使用。反射在某些框架內部使用,如模擬對象框架,依賴注入框架或服務提供者接口(SPI)。在大多數情況下,你會成爲這些東西的使用者,但不要自己寫。

順便說一句,如果你仍然想使用反射,那裏有工具可以通過反射使實例化對象更簡單:想起objenesis

相關問題