JAVA面试题分享三百七十二:代码质量检测之checkstyle的安装使用

本文详细介绍了Checkstyle的安装、使用方法,特别是XPathQuery的原理和应用,以及如何配置Checkstyle进行代码规范检查,包括Google风格的缩进和Javadoc要求。
摘要由CSDN通过智能技术生成

目录

安装使用

下载

界面化运行

打开一个.java文件

认识左边的结构

checkstyle里面的Xpath Query是什么

基本用法

示例

使用属性

复合查询

注意事项

例子

/COMPILATION_UNIT

/CLASS_DEF[./IDENT[@text='AIApp']]

/OBJBLOCK

/METHOD_DEF[./IDENT[@text='checkCodeMenu']]

如何对Checkstyle进行简单配置

下载插件

配置插件

修改检查配置

进行检测

分析结果


安装使用

官方文档地址:https://checkstyle.sourceforge.io/

下载

下载地址:https://github.com/checkstyle/checkstyle/releases/

或使用maven引入:

<dependency>    <groupId>com.puppycrawl.tools</groupId>    <artifactId>checkstyle</artifactId>    <version>10.12.7</version></dependency>

界面化运行

"D:\java17\bin\java.exe" -cp "D:\tool_configs\checkstyle-10.12.7-all.jar" com.puppycrawl.tools.checkstyle.gui.Main

运行界面如下:

打开一个.java文件

界面如下

 

认识左边的结构

	COMPILATION_UNIT	1	0	COMPILATION_UNIT	PACKAGE_DEF	1	0	package	IMPORT	3	0	import	IMPORT	4	0	import	IMPORT	5	0	import	IMPORT	6	0	import	IMPORT	7	0	import	IMPORT	8	0	import	IMPORT	9	0	import	IMPORT	10	0	import	IMPORT	11	0	import	IMPORT	12	0	import	IMPORT	13	0	import	IMPORT	14	0	import	IMPORT	15	0	import	IMPORT	16	0	import	IMPORT	17	0	import	IMPORT	18	0	import	IMPORT	19	0	import	IMPORT	20	0	import	IMPORT	21	0	import	IMPORT	22	0	import	IMPORT	23	0	import	IMPORT	24	0	import	IMPORT	25	0	import	IMPORT	26	0	import	IMPORT	27	0	import	IMPORT	28	0	import	IMPORT	29	0	import	IMPORT	30	0	import	IMPORT	31	0	import	IMPORT	33	0	import	IMPORT	34	0	import	IMPORT	35	0	import	IMPORT	36	0	import	IMPORT	37	0	import	IMPORT	38	0	import	CLASS_DEF	40	0	CLASS_DEF	MODIFIERS	40	0	MODIFIERS	LITERAL_PUBLIC	40	0	public	LITERAL_CLASS	40	7	class	IDENT	40	13	AIApp	EXTENDS_CLAUSE	40	19	extends	IDENT	40	27	Application	OBJBLOCK	40	39	OBJBLOCK	LCURLY	40	39	{	METHOD_DEF	42	4	METHOD_DEF	MODIFIERS	42	4	MODIFIERS	TYPE	42	11	TYPE	IDENT	42	16	checkCodeMenu	LPAREN	42	29	(	PARAMETERS	42	30	PARAMETERS	RPAREN	42	53	)	SLIST	42	54	{	METHOD_DEF	51	4	METHOD_DEF	METHOD_DEF	61	4	METHOD_DEF	METHOD_DEF	84	4	METHOD_DEF	METHOD_DEF	177	4	METHOD_DEF	METHOD_DEF	231	4	METHOD_DEF	METHOD_DEF	261	4	METHOD_DEF	METHOD_DEF	297	4	METHOD_DEF	METHOD_DEF	325	4	METHOD_DEF	METHOD_DEF	365	4	METHOD_DEF	METHOD_DEF	441	4	METHOD_DEF	RCURLY	445	0	}

这是 Checkstyle GUI 解析的 Java 源文件的抽象语法树(AST)的部分内容。AST 是对代码结构的一种树形表示,它将源代码的结构以一种易于分析和处理的方式呈现。

以下是每个条目的解释:

  1. COMPILATION_UNIT: 表示整个 Java 编译单元,即一个 Java 文件。

  2. PACKAGE_DEF: 表示 Java 包的定义,即 package 语句。

  3. IMPORT: 表示导入语句,即 import 语句。

  4. CLASS_DEF: 表示 Java 类的定义,包括类的修饰符、类名、继承关系等。

  5. MODIFIERS: 表示修饰符,例如 public

  6. LITERAL_PUBLIC: 表示 public 关键字。

  7. LITERAL_CLASS: 表示 class 关键字。

  8. IDENT: 表示标识符,例如类名、方法名等。

  9. EXTENDS_CLAUSE: 表示类的继承关系,即 extends 关键字。

  10. OBJBLOCK: 表示代码块,包括类的主体。

  11. LCURLY: 表示左大括号 {

  12. METHOD_DEF: 表示方法的定义。

  13. TYPE: 表示数据类型。

  14. LPAREN: 表示左圆括号 (

  15. PARAMETERS: 表示方法的参数。

  16. RPAREN: 表示右圆括号 )

  17. SLIST: 表示语句块,包含在方法或代码块内的语句。

  18. RCURLY: 表示右大括号 }

这些条目组合在一起构成了 Java 源文件的结构。Checkstyle 使用 AST 来遍历和检查源代码,确保代码符合定义的规范。在这个例子中,可能是一个包含类定义和多个方法的 Java 文件。

checkstyle里面的Xpath Query是什么

Checkstyle 的 XPath Query 功能允许用户定义自定义规则并在代码中使用 XPath 表达式进行检查。这个功能允许开发者基于代码结构的 XPath 查询来定义检查规则,XPath 表达式用于定位和匹配源代码中的特定结构。以下是 Checkstyle XPath Query 的基本用法和示例

基本用法

XPath Query 的基本语法为

//XPath_Expression

其中,// 表示查找匹配的任意位置,XPath_Expression 是 XPath 表达式。

示例

查找所有类定义xpath //CLASS_DEF查找所有包含 System.out.println 的语句xpath //EXPR[matches(@text, 'System\.out\.println')]

使用属性

XPath 还支持使用元素的属性进行匹配。例如,可以使用 @token 属性匹配指定类型的元素。

//LITERAL[@token='abstract']
复合查询

可以使用逻辑运算符 andor 和 not 来组合多个查询条件。

//CLASS_DEF[MODIFIERS/LITERAL_PUBLIC and not(MODIFIERS/LITERAL_STATIC)]
注意事项

XPath 查询功能需要在 Checkstyle 配置文件中启用。在配置文件中,使用 <module name="XPathCheck"/> 启用 XPath 检查器。xml <module name="XPathCheck"/>XPath 表达式通常基于 XML 结构,但在 Checkstyle 中,它用于匹配 AST(抽象语法树)中的代码结构。因此,XPath 表达式的使用方式可能与常规 XML 文档中的 XPath 表达式有所不同。Checkstyle 的 XPath Query 功能是强大的,但也需要一定的 XPath 知识。详细的 XPath 表达式语法和使用方法可以参考 XPath 的相关文档。

例子

让我们逐步解析这个表达式

/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='AIApp']]/OBJBLOCK/METHOD_DEF[./IDENT[@text='checkCodeMenu']]
/COMPILATION_UNIT

从根节点开始,查找名为 COMPILATION_UNIT 的元素。

/CLASS_DEF[./IDENT[@text='AIApp']]

在找到的 COMPILATION_UNIT 中,查找名为 CLASS_DEF 的子元素,并确保其中有一个子元素的名字为 IDENT 且其文本内容为 'AIApp'

/OBJBLOCK

在满足上述条件的 CLASS_DEF 中,查找名为 OBJBLOCK 的子元素。

/METHOD_DEF[./IDENT[@text='checkCodeMenu']]

在 OBJBLOCK 中,查找名为 METHOD_DEF 的子元素,并确保其中有一个子元素的名字为 IDENT 且其文本内容为 'checkCodeMenu'。这个 XPath Query 的整体作用是定位一个 Java 源代码文件中,包含一个类定义(CLASS_DEF)的 COMPILATION_UNIT,这个类的名字是 'AIApp',在这个类的 OBJBLOCK 中包含一个名为 'checkCodeMenu' 的方法(METHOD_DEF)。这种 XPath Query 可以用于 Checkstyle 中,作为自定义规则的一部分,用于检查代码中是否包含特定类和方法的定义,以确保符合团队的编码规范。

基于上面的步骤,我们就可以去定位代码了。

如何对Checkstyle进行简单配置

可以配置来检查和强制执行不同的编码规范和最佳实践。我们先来看看如何在IDEA中使用CheckStyle

下载插件

在idea的插件商店中安装下载CheckStyle-IDEA,如下图:

配置插件

进入editor->Inspections->搜索Checkstyle 全部勾上

 

修改检查配置

进入 Tools->Checkstyle

可以发现区域中包含了两部分的检测方案,分别是sun公司和Google的规范对应的配置。相关的介绍我们可以在官方文档中可以看到,地址分别是https://checkstyle.sourceforge.io/google_style.html 和 https://checkstyle.sourceforge.io/sun_style.html

进行检测

在安装好了checkstyle之后,我们就可以在idea的界面看到相关的操作。

 

点击1处按钮,进入checkstyle的操作,选择2中的Google Checks,然后选择3代表的是启动分析,将会分析4对应的文件,最终将结果输出到窗口中。

分析结果

下面是一个简单Checkstyle 对 Java 代码进行了 Google 风格的检查,并给出了一系列的警告和错误

Checkstyle found 36 item(s) in 1 file(s)YamlUtils.java : 36 item(s)Package name 'com.demo123567.desktop.auto_tools.utils' must match pattern '^[a-z]+(\.[a-z][a-z0-9]*)*$'. (1:9) [PackageName]缺少摘要javadoc。(6:0) [SummaryJavadoc]'method def modifier' 缩进了4个缩进符,应为2个。(12:5) [Indentation]'method def' 子元素缩进了8个缩进符,应为4个。(13:9) [Indentation]'method def rcurly' 缩进了4个缩进符,应为2个。(14:5) [Indentation]'method def modifier' 缩进了4个缩进符,应为2个。(16:5) [Indentation]'method def' 子元素缩进了8个缩进符,应为4个。(17:9) [Indentation]'method def' 子元素缩进了8个缩进符,应为4个。(18:9) [Indentation]'method def rcurly' 缩进了4个缩进符,应为2个。(19:5) [Indentation]'method def modifier' 缩进了4个缩进符,应为2个。(21:5) [Indentation]'method def' 子元素缩进了8个缩进符,应为4个。(22:9) [Indentation]'method def' 子元素缩进了8个缩进符,应为4个。(23:9) [Indentation]'method def rcurly' 缩进了4个缩进符,应为2个。(24:5) [Indentation]'method def modifier' 缩进了4个缩进符,应为2个。(26:5) [Indentation]'method def' 子元素缩进了8个缩进符,应为4个。(27:9) [Indentation]'method def rcurly' 缩进了4个缩进符,应为2个。(28:5) [Indentation]'method def modifier' 缩进了4个缩进符,应为2个。(30:5) [Indentation]'method def' 子元素缩进了8个缩进符,应为4个。(31:9) [Indentation]'method def rcurly' 缩进了4个缩进符,应为2个。(32:5) [Indentation]Javadoc的第一句缺少一个结束时期。(34:0) [SummaryJavadoc]@标签应有非空说明。(37:0) [NonEmptyAtclauseDescription]@标签应有非空说明。(38:0) [NonEmptyAtclauseDescription]'method def modifier' 缩进了4个缩进符,应为2个。(40:5) [Indentation]'method def' 子元素缩进了8个缩进符,应为4个。(41:9) [Indentation]'method def rcurly' 缩进了4个缩进符,应为2个。(42:5) [Indentation]'method def modifier' 缩进了4个缩进符,应为2个。(44:5) [Indentation]'method def' 子元素缩进了8个缩进符,应为4个。(45:9) [Indentation]'method def rcurly' 缩进了4个缩进符,应为2个。(46:5) [Indentation]'method def modifier' 缩进了4个缩进符,应为2个。(48:5) [Indentation]WhitespaceAround: '{' is not preceded with whitespace. (48:66) [WhitespaceAround]'method def' 子元素缩进了8个缩进符,应为4个。(49:9) [Indentation]',' 后应有空格。(49:61) [WhitespaceAfter]'method def' 子元素缩进了8个缩进符,应为4个。(50:9) [Indentation]'method def rcurly' 缩进了4个缩进符,应为2个。(51:5) [Indentation]本行字符数 1,495个,最多:100个。(57:0) [LineLength]注释应与第48行代码同样缩进4个缩进符,而不是0个。(65:1) [CommentsIndentation]

以下是对每个问题的简要解释:

  1. Package name 'com.demo123567.desktop.auto_tools.utils' must match pattern '^[a-z]+(.[a-z][a-z0-9])$'.

    • 包名不符合规范,应该是小写字母开头的小写字母和数字的组合。

  2. 缺少摘要 javadoc。

    • 在某个地方缺少了对方法或类的摘要 Javadoc 注释。

  3. 'method def modifier' 缩进了 4 个缩进符,应为 2 个。

    • 方法定义的修饰符缩进不符合规范,应该缩进 2 个空格。

  4. 'method def' 子元素缩进了 8 个缩进符,应为 4 个。

    • 方法定义的子元素(参数、方法体等)缩进不符合规范,应该缩进 4 个空格。

  5. 'method def rcurly' 缩进了 4 个缩进符,应为 2 个。

    • 方法定义的右大括号缩进不符合规范,应该缩进 2 个空格。

  6. Javadoc 的第一句缺少一个结束句点。

    • Javadoc 注释的第一句应该以一个结束句点结尾。

  7. @标签应有非空说明。

    • Javadoc 注释中的 @ 标签应该有非空说明。

  8. WhitespaceAround: '{' is not preceded with whitespace.

    • { 前面没有空格。

  9. ',' 后应有空格。

    • 逗号后应该有一个空格。

  10. 本行字符数 1,495 个,最多:100 个。

  • 一行代码的长度超过了最大限制。

  1. 注释应与第 48 行代码同样缩进 4 个缩进符,而不是 0 个。

  • 注释的缩进不符合规范,应该与相应的代码同样缩进。

这些问题主要涉及到代码格式、缩进、Javadoc 注释等方面的规范。我们可以根据这些提示逐一修复代码,以确保代码符合 Google 的编码规范。

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

之乎者也·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值