【发布时间】: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