在编写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。
你对我有任何暗示吗?
答案 0 :(得分:1)
您应该为此使用语义API。在您要检查的标识符上(在您的情况下field
,您应该通过memberSelectExpression访问)使用symbol()
的{{1}}方法获取关联的符号。
在返回的符号上,您可以使用IdentifierTree
方法确定此字段的可见性(您还有许多其他方法可以处理该符号)。