如何编写Eclipse-PMD的XPath表达式精准检测变量赋值硬编码字面量
解决PMD自定义规则识别变量赋值硬编码字面量的问题
你当前的XPath表达式存在两个核心问题:
- 未限定字面量必须属于变量赋值语句的右侧,导致误判方法调用参数中的字面量
- 布尔值识别逻辑未结合赋值语句上下文,同时多节点选择的优先级问题导致布尔值被过滤
解决方案
使用以下XPath表达式可精准匹配需求:
//AssignmentExpression[@Operator='=']/RightOperand//*[ (self::NumericLiteral or self::BooleanLiteral or (self::StringLiteral and string-length(@Image) > 10)) and not(ancestor::ArgumentList) and not(ancestor::Annotation) ]
表达式各部分作用
//AssignmentExpression[@Operator='=']:定位所有等号赋值语句,确保只检查变量赋值场景/RightOperand:聚焦赋值语句的右侧值部分,避免干扰左侧变量定义self::NumericLiteral or self::BooleanLiteral:匹配数字、布尔值字面量self::StringLiteral and string-length(@Image) > 10:匹配长度超过10的字符串字面量(对应你原需求中只抓message的长字符串,排除空串"")not(ancestor::ArgumentList):排除方法调用参数列表中的字面量(比如getProperty的参数)not(ancestor::Annotation):保留你原需求中排除注解内字面量的逻辑
验证效果
在你的示例代码中,该表达式会精准识别:
String message = "helllo this is stirng"中的字符串字面量boolean b = true中的布尔值字面量int k = 0中的数字字面量
同时自动排除:
properties.getProperty("FilterQueueSet.CADObject")中的方法参数字面量String str_emptty = ""中的短字符串字面量Scanner obj = new Scanner(System.in)和int z = Integer.MaxValue中的非字面量赋值
内容的提问来源于stack exchange,提问作者DeLorean
相关产品推荐
相关产品推荐

