2009-06-09 70 views
0

我希望有人能夠指出一些有關圍繞在Java中使用Reflection的最佳實踐的有用信息。使用Java反射初始化成員變量

我支持的當前項目使用Oracle ADF Faces,並且我們發現基於手頭的目標,某些頁面最終需要在後臺bean中初始化大量組件。團隊中的一位開發人員在bean構造函數中使用反射設計了一個解決方案,以初始化特定頁面的所有成員組件。

有人擔心這可能會違反最佳實踐,雖然它可能會爲個別開發人員節省一些時間,但可能會影響應用程序的性能。

有沒有人用這種方式反思?它是可以接受的還是應該由開發人員手動編寫代碼?

回答

4

儘可能避免反射,因爲您應該處理一些通常具有編譯器能力的任務;此外,反射的使用使得重構變得更加困難,因爲一些工具不能用於反射(想想日食的重構)。

反射會對性能產生影響,但我認爲這對於可維護性問題來說是一個小問題。

如果您有一個不使用反射的解決方案,請使用它。

+0

通常我會說同樣的事情,但他並不是在談論訪問一個單獨的方法或變量;他正在討論訪問所有成員組件。這使得重構論證有點不切實際。 – 2009-06-09 16:06:03

+0

我認爲這些論點依然成立。 改變一個類型並且聲音,什麼都不起作用,因爲在反射中你使用一個字符串來表示一個類型(例如)。 – akappa 2009-06-09 16:08:44

0

反射在web框架中無處不在。面向動作的框架(如Struts2)使用反射來使用請求中的參數初始化每個動作的屬性。像Hibernate這樣的JPA實現使用反射來初始化實體的屬性。像Spring,Pico和Guice這樣的依賴注入系統使用反射爲各種對象初始化複雜的依賴關係圖。

這些項目的成功展示了在這個應用程序中反射的可行性。

+0

我知道反思很重要,而且我之前已經取得了巨大的成功,但這不是問題。真正的問題是,如果使用反射只是爲了節省開發人員的時間,那麼當可用更直接的方法時,您可以使用反射來完成任務 – doomspork 2009-06-09 16:25:26

1

我通常選擇使用Spring等框架進行顯式初始化。過度使用反射會導致難以維護或至少難以閱讀的代碼。

雖然現代JVM的反射速度更快,但您仍然會受到性能影響。

0

這取決於你如何使用反射...物體打擊公共 API

反射(例如豆類使用introspection)是非常有用的,節省了大量的開發者的時間。物體打擊私人領域

反射(或其他封裝破使用反射),可以非常迅速地給你帶來麻煩......

0

我覺得你對反射自然的偏見很好保證。我已經看到它被濫用,而且它不漂亮。這就是說,如果你的反射例程足夠強大,不可知論的成員變量的類型和成員變量的名稱(即,你不只是重寫字符串中的成員變量),以便重構班級顯然是安全的,那麼我會考慮它。

就性能而言,僅僅因爲這個原因拒絕反射可能是一種過早的優化,並且可能更好地進行基準測試並確定它是否是一個問題。