2012-05-07 120 views
2

我剛剛發現讀寫任何對象的私有字段都可以在沒有任何訪問者的情況下完成,但是使用的是反射。因此,我的問題是:對於不使用第三種技術(例如EL)而是使用JAVA的應用程序,如果我需要一個包含20個字段的POJO,實現40個訪問器會更有趣,或者使用反射來訪問它們?我想一些優點和缺點,但是任何經驗或反饋將是巨大的:)使用大型POJO的反射訪問私人領域:±1?

+7

http://www.quickmeme.com/meme/3p60cd/ –

回答

3

您可以使用反射訪問對象字段和方法,但您應該而不是

This文章列出了至少2個可測量的原因不是:

  • 性能。使用反射訪問對象方法/字段比通過訪問器訪問要慢。

  • 安全限制

  • 而最大的缺點是不可維護性,從下面的文章引述:

一個更嚴重的缺點,對於許多應用是使用反射 可以掩蓋代碼中實際發生了什麼。程序員 期望在源代碼中看到一個程序的邏輯,而諸如反射這樣的技術繞過了源代碼,可以創建維護問題 。

4

可以,但它不會是非常維護,因此:不要去做。使用getter/setter訪問成員的優點是,您可以隱藏訪問器,初始化懶惰,並且您將可以輕鬆地重構(例如,使用IDEA或Eclipse)。

+1

更不用提你有機會在通往私人之路的途中受到SecurityManager策略的影響...... – Romain

3

即使您使用反射來確定可用字段,通過getter訪問您的字段通常也會更好。您可以輕鬆弄清楚通過反射可獲得哪些獲取器並調用這些獲取器方法。這允許您:

1)動態確定可用的數據。

2)明確指出哪些字段應該可用,哪些字段應該是私人的。

3)顯式重寫getter的行爲以滿足您的需求。

在大多數正常情況下,反射用於確定對象上可用的數據。你應該而不是使用反射作爲getter和setter的一般替代。否則,你的代碼將變得真正難以維護。

1

反射僅適用於需要對對象做魔術而不能假設其結構的很多具體用例。具體而言,如果您的JVM使用SecurityManager,,則它可能會很好地防止代碼通過反射設置私有。

有關安全管理器的更多信息,您可以查看此other question