gpt4 book ai didi

java - SonarQube自定义规则-获取方法参数所有者类

转载 作者:行者123 更新时间:2023-12-02 10:47:36 25 4
gpt4 key购买 nike

目前我正在修复自定义 Sonar 规则。

private void reportMethodParametersClassContainingInternalAnnotation(MethodTree methodTree) {
if (!methodTree.parameters().isEmpty()) {
for (int i = 0; i < methodTree.parameters().size(); i++) {
if (!isParameterWrapperType(methodTree, i) && parameterClassContainsInternalAnnotation(methodTree, i)) {
reportIssue(methodTree.parameters().get(i),
methodTree.parameters().get(i).type().symbolType().fullyQualifiedName()
+ " class must be annotated @CanInvoke or must be standart java class");
}
}
}
}

private static final ArrayList<String> WRAPPER_TYPES = new ArrayList<String>(Arrays.asList("Boolean", "Character",
"Byte", "Short", "Integer", "Long", "Float", "Double", "void", "String", "int"));

private static boolean isParameterWrapperType(MethodTree tree, int i) {
return WRAPPER_TYPES.contains(tree.parameters().get(i).type().symbolType().name());
}

private boolean parameterClassContainsInternalAnnotation(MethodTree tree, int i) {
return tree.parameters().get(i).type().symbolType().symbol().metadata()
.isAnnotatedWith(Constants.INTERNAL_ANNOTATION_PATH);
}

这是方法,在方法中搜索参数。一一获取后,方法应该检查参数的类是否有@Internal注释(我公司的自定义注释)。如果有,方法会报告问题。到目前为止,它运行良好。但是当它发现参数是某个类的数组时,最后一个方法会尝试检查不是该类,而是数组(显然没有@Internal)。

为了更清楚,这是示例:

当方法参数是这样的时候:

public void hello(SimpleClass simpleClass) {

}

最后一个方法返回:

true

还有这个:

tree.parameters().get(i).type().symbolType().symbol().name();

返回:

SimpleClass

但是当方法参数是这样的时候:

public void hello(SimpleClass... simpleClass) {

}

最后一个方法返回:

false

还有这个:

tree.parameters().get(i).type().symbolType().symbol().name();

返回:

Array

应该使用什么方法来获取该参数的真正所有者并能够检查它是否带有某种注释?

最佳答案

一旦你知道了参数的类型,你应该检查它是否是一个数组,然后你可以转换为 Type.ArrayType ,它有 elementType() 方法返回数组元素的类型。

这是如何执行此操作的小示例

MethodTree methodTree = (MethodTree) tree;
for (VariableTree parameter : methodTree.parameters()) {
Type parameterType = parameter.type().symbolType();
if (parameterType.isArray()) {
Type.ArrayType arrayType = (Type.ArrayType) parameterType;
if (arrayType.elementType().symbol().metadata().isAnnotatedWith("MyAnnotation")) {
// do something
}
}
}

关于java - SonarQube自定义规则-获取方法参数所有者类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52442645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com