使用反射的JAVA重构

时间:2016-09-26 16:49:08

标签: java refactoring automated-refactoring

我在少数Java应用程序中使用第三方API。他们在最新版本中更新了一些东西。我们必须更新到最新版本,它需要从我们的代码中进行相应的更改。   变化是,

1)我们用于实现/扩展的接口和抽象类名已被更改。此外,方法名称已更改。 这些都只是名称的变化。

2)需要使用@Service

注释实现这些接口的类

3)然后需要添加一些新的Java文件和一个属性文件。

4)我们还有抽象类来实现第三部分抽象类,然后有许多具体的类。因此,第三方抽象类中的几个方法在我们的基本抽象类中被覆盖,它扩展了基本抽象类,并且在具体的抽象类中有很少的方法。

我可以通过Eclipse IDE进行重构,但我们不喜欢这个。 我喜欢这样就像运行脚本一样完全自动化。

我尝试使用Java反射来查找Abstract类的所有具体类并重命名方法。不过,它看起来很冒险。

还有其他更好的方法吗?

3 个答案:

答案 0 :(得分:1)

这取决于您需要更改多少代码,执行每个步骤需要多长时间以及重复相同重构的次数。 如果只有几百个类和/或更简单的重构(如重命名类/接口)可以完成大部分工作,那么请手工完成。

否则,如果您真的想要,可以尝试在AutoRefactor等工具中编写规则:https://github.com/JnRouvignac/AutoRefactor

免责声明:我是AutoRefactor的作者。

答案 1 :(得分:1)

我记得在某个地方读过一个程序员是一个宁愿花12个小时编写脚本来自动执行手动任务而不是花20分钟实际执行该任务的人。

我理解为什么要自动执行此操作 - 您正在使用的API通过重命名来为其客户带来生活困难。 API破坏与命名的兼容性是不寻常的 - 你确定它就这么简单吗?

我的强烈建议是咬紧牙关并手动重构。它几乎肯定比自动化过程花费的时间更少,您将发现进一步改进自己的应用程序设计的机会,并且您不太可能再次需要使用重构脚本。

答案 2 :(得分:0)

不幸的是,我现在不详细说明你的情况。根据我的经验,我可以指出一些可以简化未来生活的原则。

很快,如果您使用的是任何第三方API,请尽量减少它在您的代码中的传播。使用Adapter,Facade等模式隐藏您自己的抽象(接口)背后的第三方代码。

因此,如果第三方代码发生变化,您只能在一个地方进行更改。这种方法为您提供了额外的自由:如果您决定使用其他第三方API,它将很简单,因为您的代码的主要安静性不会被触及。此外,它在测试时非常有用:您可以模拟实际的第三方功能。

例如,假设您的项目需要持久存储。所以你可以从声明这样的界面开始:

interface IStorage {
    void save(Model m);
    Model load(int id);
}

这将允许你:

  • 决定存储提供商(可能是MySQL或 MongoDB或简单地说就是磁盘上的XML文件)。
  • 轻松替换另一个第三方API(例如从文件存储更改为数据库)。
  • 通过模拟此接口而不是使用真实存储来轻松测试业务逻辑。
  • 如果某些模块(其他开发人员不得不这样做)需要工作存储(他们只会使用),请加快开发速度 IStorage接口就好像它已经实现了一样。)