繁体   English   中英

使用反射进行JAVA重构

[英]JAVA refactoring using reflection

我在少数Java应用程序中使用了第三方API。 他们已经在最新版本中更新了一些内容。 我们将必须更新到最新版本,并且需要对代码进行相应的更改。 的变化是,

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

2)需要用@Service注释实现这些接口的类

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

4)我们也有实现第三部分抽象类的抽象类,然后有很多具体的类。 因此,在扩展基本抽象类的基础抽象类中,很少有第三方抽象类的方法被覆盖,而具体的抽象类中几乎没有方法。

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

我尝试使用Java反射来查找Abstract类的所有具体类并重命名方法。 尽管如此,它看起来还是有风险的。

还有其他更好的方法吗?

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

否则,如果您确实愿意,可以尝试在类似AutoRefactor的工具中编写规则: https : //github.com/JnRouvignac/AutoRefactor

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

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

我了解您为什么要自动执行此操作-您正在使用的API通过重命名来使客户的生活变得艰难。 API仅通过命名来破坏兼容性是不寻常的-您确定它是如此简单吗?

我的强烈建议是硬着头皮手动进行重构。 几乎可以肯定,与自动化过程相比,这将花费更少的时间,您将发现进一步的机会来改进自己的应用程序的设计,并且不太可能需要再次使用重构脚本。

不幸的是,我现在不了解您的具体情况。 我可以根据我的经验指出一些可以简化未来生活的原则。

很快,如果您使用任何第三方API,请尝试将其传播到您的代码中的可能性降至最低。 使用Adapter,Facade等模式将第三方代码隐藏在自己的抽象(接口)后面。

因此,万一第三方代码发生更改,您将只能在一个地方进行更改。 这种方法为您提供了更大的自由度:如果您决定使用另一个第三方API,它将很简单,因为不会影响代码的主要安全性。 在测试时它也很有用:您可以模拟实际的第三方功能。

例如,假设您的项目需要永久存储。 因此,您可以从这样声明接口开始:

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

这将使您:

  • 稍后再决定存储提供者(可能是MySQL或MongoDB,或者只是磁盘上的XML文件)。
  • 轻松地用一个第三方API替代另一个(例如,从文件存储更改为数据库)。
  • 通过模拟此接口而不是使用实际存储,可以轻松测试业务逻辑。
  • 如果某些模块(其他开发人员必须做)需要有效的存储(它们将仅使用IStorage接口,就好像已经实现了),则可以加快开发速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM