繁体   English   中英

如何在声纳自定义规则中访问超类的超类?

[英]How to access super class' super class in a Sonar Custom rule?

我正在编写一个自定义规则,用于检查正在分析的类是否正在扩展类型。

例如:

class Bus {
}

class Transport {
}

class PublicTransport extends Transport {
}

class Bus should extend class Transport or a sub class of Transport.

    public class EnsureSuperClassRule extends IssuableSubscriptionVisitor {

        final String SUPER_CLASS = "common.service.SuperService";

        @Override
        public List<Tree.Kind> nodesToVisit() {
        return ImmutableList.of(Tree.Kind.CLASS);
        }

        @Override
        public void visitNode(Tree tree) {

            ClassTree classTree = (ClassTree) tree;
            String className = classTree.simpleName().name();

            if (className.endsWith("Service")) {

                if(classTree.superClass() == null) {
                    return false;
                }

                if (!SUPER_CLASS.equals(localClassTree.superClass().symbolType().fullyQualifiedName())) {
                reportIssue(tree, String.format("The class should extend SuperService or a class of type SuperService"));
                }
            }
          }
        }

    }

如何获取超类的超类相关信息?

你可以简单地打电话

Class superClassOfSuperClass = this.class().getSuperClass();
superClassOfSuperClass.method().invoke(this);

我不确定你上面的例子,因为有一些拼写错误或对继承的误解

您可以像这样收集所有超类,直到达到java.lang.Object为止:

@Override
public void visitNode(Tree pTree) {
    final ClassTree classTree = (ClassTree) pTree;

    final Set<String> superclasses = new HashSet<>();
    Type currentSuperclass = classTree.symbol().superClass();
    while (currentSuperclass != null) {
        superclasses.add(currentSuperclass.fullyQualifiedName());
        currentSuperclass = currentSuperclass.symbol().superClass();
    }
    
    // ... do something with superClasses

    super.visitNode(pTree);
}

@Override
public List<Kind> nodesToVisit() {
    return ImmutableList.of(Tree.Kind.CLASS);
}

(使用 sonar-java-plugin 6.3.0 和 sonar-plugin-api 8.2.0 测试)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM