如何在Sonar规则中检测类成员(字段)访问

时间:2015-11-24 12:36:12

标签: java sonarqube

在编写Sonar规则(Java)时,我找不到检测类成员访问权限的方法。 例如:

class SomeClass {
    Object field;
}

class SomeOtherClass {
    SomeClass instance = new SomeClass();

    void method(){
        Objects.requireNonNull(instance.field);
    }

}

在此示例中,SomeOtherClass.method()访问SomeClass的受包保护的成员 我无法找到合适的org.sonar.plugins.java.api.tree.TreeVisitor方法来检测这个问题 我的第一个猜测是使用

BaseTreeVisitor.visitMemberSelectExpression(MemberSelectExpressionTree))

但它没有像我预期的那样奏效。

我将代码提交给https://github.com/arxes-tolina/sonar-plugins/ 并仅使用调试输出实现UnexpectedAccessCheck.visitMemberSelectExpression(MemberSelectExpressionTree)。运行测试利益到控制台上的某些行:

[main] DEBUG d.t.s.p.v.c.UnexpectedAccessCheck - visitMemberSelectExpression invoked. Name of the symbol of identifier: !unknownSymbol!

可能是,这个问题与此有关 Proper way for getting annotations of Java-Methods in custom Sonar rules

我使用了1.7.1的sonar-java-plugin和5.1的sonar-plugin-api。

你对我有任何暗示吗?

1 个答案:

答案 0 :(得分:1)

您应该为此使用语义API。在您要检查的标识符上(在您的情况下field,您应该通过memberSelectExpression访问)使用symbol()的{​​{1}}方法获取关联的符号。

在返回的符号上,您可以使用IdentifierTree方法确定此字段的可见性(您还有许多其他方法可以处理该符号)。