我剛剛發現讀寫任何對象的私有字段都可以在沒有任何訪問者的情況下完成,但是使用的是反射。因此,我的問題是:對於不使用第三種技術(例如EL)而是使用JAVA的應用程序,如果我需要一個包含20個字段的POJO,實現40個訪問器會更有趣,或者使用反射來訪問它們?我想一些優點和缺點,但是任何經驗或反饋將是巨大的:)
使用大型POJO的反射訪問私人領域:±1?
回答
您可以使用反射訪問對象字段和方法,但您應該而不是。
This文章列出了至少2個可測量的原因不是:
性能。使用反射訪問對象方法/字段比通過訪問器訪問要慢。
安全限制
而最大的缺點是不可維護性,從下面的文章引述:
一個更嚴重的缺點,對於許多應用是使用反射 可以掩蓋代碼中實際發生了什麼。程序員 期望在源代碼中看到一個程序的邏輯,而諸如反射這樣的技術繞過了源代碼,可以創建維護問題 。
您可以,但它不會是非常維護,因此:不要去做。使用getter/setter訪問成員的優點是,您可以隱藏訪問器,初始化懶惰,並且您將可以輕鬆地重構(例如,使用IDEA或Eclipse)。
更不用提你有機會在通往私人之路的途中受到SecurityManager策略的影響...... – Romain
即使您使用反射來確定可用字段,通過getter訪問您的字段通常也會更好。您可以輕鬆弄清楚通過反射可獲得哪些獲取器並調用這些獲取器方法。這允許您:
1)動態確定可用的數據。
2)明確指出哪些字段應該可用,哪些字段應該是私人的。
3)顯式重寫getter的行爲以滿足您的需求。
在大多數正常情況下,反射用於確定對象上可用的數據。你應該而不是使用反射作爲getter和setter的一般替代。否則,你的代碼將變得真正難以維護。
反射僅適用於需要對對象做魔術而不能假設其結構的很多具體用例。具體而言,如果您的JVM使用SecurityManager
,,則它可能會很好地防止代碼通過反射設置私有。
有關安全管理器的更多信息,您可以查看此other question。
- 1. Java:通過反射訪問私人領域(行爲)
- 2. 使用反射訪問私人會員
- 3. 訪問Java中的私人領域
- 4. 參考私人領域使用番石榴反射
- 5. hibernate如何訪問私人領域?
- 6. Reflection.Emit私人領域/財產訪問
- 7. 用反射找到一個私人領域?
- 8. 如何訪問使用反射的私人基類字段
- 9. 不能設置內部類的私人領域使用java反射
- 10. 使用反射訪問私人內部類字段
- 11. Junit的私人領域
- 12. INotifyPropertyChanged的帶私人領域
- 13. 何時不使用私人領域?
- 14. 使用ProGuard混淆私人領域
- 15. 使用MSTest測試私人領域
- 16. 我怎樣才能比較POJO他們的領域反射
- 17. 訪問類模塊中的私人領域
- 18. 私人領域不編譯
- 19. 模式與私人領域
- 20. 私人領域是超
- 21. 嘲笑私人領域
- 22. 休眠:錯誤訪問領域的私人java.lang.Integer中]通過反射的持久化屬性
- 23. Vb.Net作用域的問題 - 私人領域
- 24. 非法反射訪問$ 1
- 25. 爲什麼可以訪問私人領域?
- 26. 如何訪問和改變斯卡拉私人領域?
- 27. 私人領域的多個模型,如何使RoR?
- 28. ReflectionUtils和BeanUtils用於私人領域
- 29. 更好地使用反射或我的小黑客訪問私人方法?
- 30. 私人領域的垃圾收集
http://www.quickmeme.com/meme/3p60cd/ –