Java 确保带有特定注释的字段为';私人';

Java 确保带有特定注释的字段为';私人';,java,intellij-idea,static-analysis,checkstyle,pmd,Java,Intellij Idea,Static Analysis,Checkstyle,Pmd,代码中最常见的错误是编写 @Mock Object object; @InjectMocks Subject subject; 而不是 @Mock private Object object; @InjectMocks private Subject subject; 这可以防止PMD/FindBugs/IntelliJ在字段未使用时发出警告,并且我们的代码审查中充斥着“将此字段设置为私有”注释 当带有特定注释的字段没有预期的可见性时,任何工具中是否有任何静态分析规则来发出警告 我找到了Ch

代码中最常见的错误是编写

@Mock Object object;
@InjectMocks Subject subject;
而不是

@Mock private Object object;
@InjectMocks private Subject subject;
这可以防止PMD/FindBugs/IntelliJ在字段未使用时发出警告,并且我们的代码审查中充斥着“将此字段设置为私有”注释

当带有特定注释的字段没有预期的可见性时,任何工具中是否有任何静态分析规则来发出警告

我找到了Checkstyle,但它标记了所有非私有字段,而不仅仅是带有特定注释的字段。

您可以在IntelliJ IDEA中使用结构化搜索检查。例如,使用如下模式:

@Mock @Modifier("packageLocal") $FieldType$ $FieldName$ = $Init$;
字段类型:最小值:1,最大值:1
字段名:最小值:1,最大值:1

Init:min:0,max:1

您可以使用PMD的规则设计器创建新的XPath规则,该规则可以嵌入到PMD规则集xml文件中。我还没有将PMD与IntellijIDEA或Jenkins一起使用,但我确信这些插件是存在的

以下是我制定的规则(未在规则设计器之外测试):


3.

谢谢-您是否认为有可能在Jenkins上实现自动化,并在这种模式匹配的情况下通过有意义的消息使构建失败?IntelliJ IDEA有一个inspect.sh脚本,它是bin目录,可用于类似的操作。你可能还需要Jenkins的插件。很抱歉,我帮不上什么忙,我自己从来没有用过詹金斯。这里有一个关于写作规则的教程:上面的链接似乎不见了,添加了一个存档链接:我不会把它作为一个新的答案发布,因为我没有访问它的权限-这是一个商业工具。Fortify似乎同时支持和查询。
<rule  name="NonPrivateMockAnnotation"
  message="Mock anotation should be private"
  class="net.sourceforge.pmd.lang.rule.XPathRule">
  <description>
  </description>
  <properties>
    <property name="xpath">
    <value>
<![CDATA[
//ClassOrInterfaceBodyDeclaration[
    Annotation/MarkerAnnotation/Name[
        @Image = 'InjectMocks' or
        @Image = 'Mock' 
    ] and
    FieldDeclaration/@Private = 'false'
]
]]>
    </value>
    </property>
  </properties>
  <priority>3</priority>
  <example>
<![CDATA[
class Example {
  @Mock Object object;
  @InjectMocks Subject subject;
}
]]>
  </example>
</rule>