问题描述
我有两种情况需要检查样式。假设我有一堆带有@BusinessLogic注释的对象。我想首先通过所有* .java文件创建一个具有这些对象的完整类名的Set。假设这里的类之一是MyBusinessLogic。下一步,作为自定义检查样式检查器的一部分,如果任何代码行中都有任何表示“ new MyBusinessLogic()”的代码行,我想通过构建并使其失败。当对象使用@BusinessLogic注释时,我们想强制执行DI。 Checkstyle是否可能?我不确定checkstyle是否可以通过双重验证。
我正在考虑的另一个选项是某个gradle插件,它可能会扫描所有java文件并将用@BusinessLogic注释的类的列表写入文件,然后在我的检查程序读取文件的位置之后运行checkstyle?
我的下一个情况是我有一个以jar形式提供的库,因此在该jar中,我也有带有@BusinessLogic注释的类,我需要确保将这些类也添加到我的不应该手动更新的类列表中并且仅通过依赖项注入创建。
在阅读完样式检查文档后,从上一个问题中继续提问:
How to enforce this pattern via gradle plugins?
谢谢, 院长
解决方法
是否可以编写双重通过的checkstyle检查?
可能,是的,但未获得官方支持。支持会在https://github.com/checkstyle/checkstyle/issues/3540进行,但尚未达成共识。
可以使用FileSets进行多文件验证(仍未正式支持),但是使用TreeWalker检查变得更加困难。这是因为TreeWalker不会将finishProcessing
链接到支票。您可以实现自己的TreeWalker,它将将此finishProcessing
链接到AbstractChecks的实现。
您将必须使用此方法一次性完成所有操作。记录所有new XXX
和带有注解@YYY
的类。在finishProcessing
方法中,将2之间获得的信息关联起来,并在匹配时打印违规。
我有一个罐子装的图书馆
Checkstyle不支持读取JAR或字节码。您始终可以创建一个硬编码列表作为替代。唯一的其他方法是将您自己的阅读器构建为Checkstyle。