Java反思和重构的痛苦

lud*_*d0h 10 java language-agnostic reflection refactoring

Java Reflection提供了一种在运行时对Object进行内省的机制.没有第二个想法,这是一个很棒的功能,但它打破了所有的重构惯例!

File Search即使在现代IDE中也没有简单的方法(除了)以了解哪个属性被引用以及在哪里.这使得Refactorings变得更加复杂(令人厌烦!)并且容易出错.

坦率地说,不只是Reflection API; Hibernate mapping files (hbm.xml)并且JSP files都将属性称为String,当您重构属性名称时,您必须手动更改所有这些位置.

更糟糕的是,Hibernate映射文件或JSP文件中的更改会导致运行时错误.

我很想知道其他程序员如何在Java中处理这个问题.有一些工具吗?我使用Eclipse/IBM RAD作为主要开发平台.通常我们使用a constant来定义属性并尽可能地使用它,但它并不总是可行的.

我也很感兴趣其他语言如何处理这个问题!

Cli*_*ler 7

Java反射会导致许多与动态类型语言(如Python和Ruby)相同的问题.事实上,考虑动态类型语言的一种方法是使用反射调用所有内容,并且语言只为反射提供了一个漂亮,干净的语法.

是的,使用动态类型语言(或反射的大量使用),重构很难.您没有获得良好的Eclipse重构功能.相反,grep成为你的朋友.

根据我的经验,你能做的最好的事情就是建立一个良好的单元测试安全网.这样,如果你在重构期间破坏了一些动态代码,至少在运行测试时你会很快发现它.

如果你正在做很多静态类型的代码,那么如果你没有良好的单元测试基础,你就会遇到大麻烦.如果你正在做很多动态类型的代码(包括带有大量反射的代码),没有良好的单元测试基础,你就没有希望成功.