【问题标题】:Custom Validator for Static Use of Reflection vs. Custom Rule in SonarQube (Java, Eclipse)用于静态使用反射的自定义验证器与 SonarQube(Java、Eclipse)中的自定义规则
【发布时间】:2017-07-07 10:33:46
【问题描述】:

可能有一些相关的问题,但我认为我的情况非常特殊,足以证明一个问题的合理性。

我正在处理一个历史悠久的大型 Java 项目(远远超过一百万个 LOC,由于其他原因,我们目前仍然绑定到 Java 6),其中反射用于在表格中显示数据 - 反射是不用于动态更改显示的数据,而仅用于在代码中使用某种快捷方式。代码的简化部分如下所示。

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,所以应该可以编写这样一个自定义验证器 - 有什么好的起点吗? 如果TableColumn(parameter) 中的parameter 不是final(应该是文字或常量),验证器应该在eclipse 中显示警告。如果将TableColumn 添加到TableColumns 并且对应的Bean.getParameter() 不存在,则验证器应在eclipse 中显示错误。

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

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

我的要求:

  • 在这种情况下什么会更容易:为 eclipse 编写自定义验证器或为 SonarQube 编写自定义规则?

  • 提示从哪一种方法开始

  • 其他解决方案的提示

感谢您的帮助。

【问题讨论】:

    标签: java eclipse validation reflection sonarqube


    【解决方案1】:

    一些替代方案:

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

    【讨论】:

    • 我认为方法引用是 Java 8 附带的?该项目仍然绑定到 Java 6,原因很复杂,这里用 500 个字符来解释。由于庞大的代码库,添加注释也需要数百小时。因此,我在问如何为这种特定情况编写验证器或自定义规则,而无需更改代码。当项目可能在 10 年后迁移到 Java 8 时,我们可以重新考虑使用方法引用。
    猜你喜欢
    • 1970-01-01
    • 2020-08-14
    • 2014-04-22
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    相关资源
    最近更新 更多