繁体   English   中英

用于SonarQube(Java,Eclipse)中静态使用反射与自定义规则的自定义验证器

[英]Custom Validator for Static Use of Reflection vs. Custom Rule in SonarQube (Java, Eclipse)

可能存在一些相关的问题,但是我认为我的情况非常独特,足以单独提出一个问题。

我正在开发一个历史悠久的大型Java项目(由于其他原因,我们目前仍绑定Java 6,因此LOC远远超过100万个LOC),其中反射用于在表中显示数据-反射不用于动态更改显示的数据,但仅用于在代码中使用某种捷径。 代码的简化部分如下所示。

TableColumns taco = new TableColumns(Bean.class);
taco.add(new TableColumn("myFirstMember"));
taco.add(new TableColumn("mySecondMember"));
 ...
List<Bean> dataList = getDataFromDB(myFilterSettings);
taco.displayTable(dataList);

因此,每一行的表格单元格的值都存储在Bean的实例中。 第一个单元格的值来自调用itemOfDataList.getMyFirstMember() (因此,代码的反射部分来自此)。 表格单元格的呈现取决于itemOfDataList.getMyFirstMember()的返回类型。

这样,很容易将新列添加到表中,使它们以标准方式呈现而无需关心任何细节。

这种方法的问题:当getter名称更改时,编译器不会注意到,并且在运行时会发生异常,以防Bean.getMyFirstMember()重命名为Bean.getMyFirstMemberChanged()

虽然使用反射来确定调用哪个getter,但实际上所需的信息在编译时可用,但没有任何变量用于列信息。

我的目标是:拥有一个验证器,该验证器将在编译时检查Bean类中所需的getter方法是否存在。

可能的解决方法:

  • 修改代码 (使用更具体的信息,编写适配器,使用批注或编译器可以在编译时检查的任何内容),由于代码基础庞大, 我显然不希望这种解决方案 我只需要保证反射在运行时不会失败。

  • 编写自定义验证器 :我想这应该不太复杂,但是我不知道如何开始,我们使用eclipse作为ide,因此应该有可能编写这样的自定义验证器-任何提示都是一个好的起点? 验证器应该显示在蚀警告,如果parameterTableColumn(parameter)是不final (应该是文字或恒定)。 如果将TableColumn添加到TableColumns并且相应的Bean.getParameter()不存在,则验证器将在Eclipse中显示错误。

  • 当我们使用SonarQube进行质量检查时,如果方法确实存在,我们还可以实施自定义规则检查-不能完全确定这种自定义规则是否可行(可能是)

  • 也许其他解决方案可以在Eclipse中提供快速反馈,即某些表被重命名后,某些表将无法正确呈现

我要的是:

  • 在这种情况下,更简单的方法是:为日食编写自定义验证器,或为SonarQube编写自定义规则?

  • 提示从哪一种方法开始

  • 其他解决方案的提示

谢谢你的帮助。

一些替代方案:

  1. 您可以为此模式迁移到更现代的Java,它是方法引用的主要候选对象。 然后,您选择的IDE可以在您重构/重命名时自动解决该问题。 随着机会/必要性的出现,这可以一点一点地完成。
  2. 您可以编写自己的自定义注释:
    • 您可能可以让SonarQube进行扫描
    • 这可能使您可以利用javax.validation。*好东西,因此您的代码可能看起来/感觉更像“标准” Java EE代码。
    • 注释可以在构建步骤中由处理器覆盖,各种构建工具都有实现此目的的方法-并且处理器可以进行更高级/更昂贵的自省,因此您可以将验证推到编译时而不是运行时。

暂无
暂无

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

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