我刚刚发现读取和写入任何对象的任何私有字段都可以在没有任何访问器的情况下完成,但使用反射。
所以,我的问题是:对于不使用第三种技术(例如 EL)但使用 JAVA 的应用程序,如果我需要一个包含 20 个字段的 POJO,是实现 40 个访问器更有趣,还是使用反射来访问它们?我猜有一些优点和缺点,但任何经验或反馈都会很棒:)
我刚刚发现读取和写入任何对象的任何私有字段都可以在没有任何访问器的情况下完成,但使用反射。
所以,我的问题是:对于不使用第三种技术(例如 EL)但使用 JAVA 的应用程序,如果我需要一个包含 20 个字段的 POJO,是实现 40 个访问器更有趣,还是使用反射来访问它们?我猜有一些优点和缺点,但任何经验或反馈都会很棒:)
你可以,但它不是很容易维护,所以:不要这样做。使用 getter/setter 访问成员的优点是,您可以隐藏访问器,初始化惰性,并且您将能够轻松地重构(例如使用 IDEA 或 Eclipse)。
您可以使用反射访问对象字段和方法,但不应该。
本文列出了至少 2 个可衡量的原因:
表现。使用反射访问对象方法/字段比通过访问器访问要慢。
安全限制
最大的缺点是不可维护性,引用下面的文章:
许多应用程序的一个更严重的缺点是使用反射会掩盖代码中实际发生的事情。程序员希望在源代码中看到程序的逻辑,而绕过源代码的反射等技术可能会产生维护问题。
通常最好通过 getter 访问您的字段,即使您使用反射来确定哪些字段可用。您可以通过反射轻松找出可用的 getter 并调用这些 getter 方法。这使您可以:
1)动态找出可用的数据。
2) 明确说明哪些字段应该可用,哪些字段应该是私有的。
3) 明确覆盖 getter 的行为以满足您的需要。
在大多数正常情况下,反射用于确定对象上可用的数据。您不应该将反射用作 getter 和 setter 的一般替代品。否则,您的代码将变得真正无法维护。
反射仅适用于需要对对象施展魔法而又无法对其结构做出太多假设的特定用例。具体来说,如果您的 JVM 使用SecurityManager
,它很可能会阻止代码通过反射设置私有。
您可以查看其他问题以获取有关安全管理器的更多信息。