Java Reflection 提供了一种在运行时自省对象的机制。毫不犹豫,这是一个很棒的功能,但它打破了所有重构约定!
没有简单的方法(除了File Search
)甚至在现代 IDE 中也能知道引用了哪个属性以及在哪里引用。这使得重构变得更加复杂(令人厌烦!)并且容易出错。
坦白说,这不仅仅是Reflection API
; Hibernate mapping files (hbm.xml)
and JSP files
两者都将属性引用为字符串,当您重构属性名称时,您必须在所有这些地方手动更改。
更糟糕的是,Hibernate 映射文件或 JSP 文件中的更改会导致运行时错误。
我有兴趣了解其他程序员如何在 Java 中处理这个问题。有一些工具吗?我使用Eclipse/IBM RAD作为主要开发平台。通常我们使用一个constant
定义属性并尽可能使用它,但并不总是可行。
我也很感兴趣其他语言如何处理这个问题!
Java 反射会导致许多与动态类型语言(例如 Python 和 Ruby)相同的问题。事实上,考虑动态类型语言的一种方法是,一切都是使用反射来调用的,并且这些语言只是为反射提供了一种漂亮、干净的语法。
是的,对于动态类型语言(或大量使用反射),重构很困难。您无法获得出色的 Eclipse 重构功能。相反,grep 成为您的朋友。
根据我的经验,你能做的最好的事情就是为自己建立一个良好的单元测试安全网。这样,如果您在重构过程中破坏了一些动态代码,至少在运行测试时您会很快发现它。
如果您正在编写大量静态类型代码,并且没有良好的单元测试基础,那么您就会遇到大麻烦。如果您正在编写大量动态类型代码(包括具有大量反射的代码),那么如果没有良好的单元测试基础,您就没有成功的希望。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)