[英]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);
}
这将使您:
IStorage
接口,就好像已经实现了),则可以加快开发速度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.