我開始知道,使用反射我們可以創建對象而不使用「新」關鍵字。所以我想知道他們是否有任何差異或使用Reflection的特定場景。因爲直到現在我沒有創建或看到任何代碼創建與反射的對象。使用「新」關鍵字創建的對象並使用反射創建對象
爲什麼使用'新'變得如此使用和反思沒有。
我開始知道,使用反射我們可以創建對象而不使用「新」關鍵字。所以我想知道他們是否有任何差異或使用Reflection的特定場景。因爲直到現在我沒有創建或看到任何代碼創建與反射的對象。使用「新」關鍵字創建的對象並使用反射創建對象
爲什麼使用'新'變得如此使用和反思沒有。
只有在想要基於名稱(字符串)或在編譯時無法訪問的類型(例如插件)實例化類型時,纔會使用反射。你不想用它來代替new
在正常情況下實例化類型。
反射通常比簡單的代碼慢得多,使用起來更繁瑣。它不是普通代碼的替代品(如新運算符),而是常規代碼無法使用的情況的替代方法。
Mehrdad是正確的。在需要在運行時而不是編譯時執行某些操作時使用反射。也許你需要執行的方法直到運行時才知道,或者對象類型不是。插件就是一個很好的例子。
反射會帶來性能下降,這就是爲什麼您應該嘗試將其限制爲僅適用於不適合您的情況。
爲什麼使用'new'變得如此使用,並且反射不到。
與「新」關鍵字相比,使用反射是很多工作;它也導致較少可讀的代碼。
當出於某種原因,實例化對象的代碼無法知道該對象的具體類型時,會使用反射。反射廣泛用於creational design patterns。
對於一個更加真實世界的例子,在春季框架中這種用法很多。我們將在xml中定義對象及其協作類的依賴項,並且容器實際上將使用反射來創建它們的實例,甚至使用反射調用生命週期方法並移交創建的對象。這是您將使用的一種典型場景。此外,如果您查看大多數BRMS解決方案,它們會使用反射來在運行時使用反射來觸發業務規則方法。儘管每天使用反射創建對象的真實世界都很少,但使用JDBC(Class.forName(「driver class」))時,使用某種反射的另一個地方是其他地方。
假設你想用一個構造函數,採用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被盜)
應當清楚比前者既更可讀的和更快的鍵入。此外,反思往往痛苦緩慢。另一方面,反射允許在編譯時不需要知道類就可以實例化對象。
總之,只有在沒有其他選擇時才使用反射...
贊成的new
:
贊成反思:
所以,你可以看到,new
是你想要在99%的情況下使用。反射在某些框架內部使用,如模擬對象框架,依賴注入框架或服務提供者接口(SPI)。在大多數情況下,你會成爲這些東西的使用者,但不要自己寫。
順便說一句,如果你仍然想使用反射,那裏有工具可以通過反射使實例化對象更簡單:想起objenesis。
我甚至會說,避免在任何其他時間使用它。它會造成不必要的混淆和脆弱。 – 2010-01-20 20:21:45
@亞歷克斯:確實。他們沒有真正的可比性。意味着做不同的事情。 – 2010-01-20 20:24:43