如何使用CodeQL检测Java注解是否显式指定了特定属性
CodeQL查询实现方案
核心思路
CodeQL的Java模型中,getValue()方法会自动返回注解属性的默认值,因此无法区分「显式设置为默认值」和「未传参使用默认值」两种场景。我们可以通过判断注解是否存在显式声明的对应名称参数来实现需求,对应API为Annotation.getArgument(string paramName).exists(),该API仅会匹配开发者在代码中手动写出的参数,不会包含默认补全的参数。
完整查询代码
import java from Field targetField, Annotation abcAnnotation where // 匹配字段上标注的@ABC注解 abcAnnotation = targetField.getAnnotation("ABC") // 排除显式设置了name参数的注解(哪怕设置的值和默认值一致也会被排除) and not abcAnnotation.getArgument("name").exists() select targetField, "该字段标注@ABC注解且未显式指定name属性"
效果说明
针对你给出的示例代码:
- 字段
field1标注的@ABC(name = "abc")存在显式name参数,不会被查询命中 - 字段
field2标注的@ABC没有显式name参数,会被查询命中 - 如果存在
@ABC(name = "")的字段,因为显式写了name参数,不会被查询命中,符合需求。
内容的提问来源于stack exchange,提问作者Mansur
相关产品推荐
相关产品推荐

