Java 如何在Sonar规则中检测类成员(字段)访问
在编写Sonar规则(Java)时,我找不到一种方法来检测对类成员的访问。 例如:Java 如何在Sonar规则中检测类成员(字段)访问,java,sonarqube,Java,Sonarqube,在编写Sonar规则(Java)时,我找不到一种方法来检测对类成员的访问。 例如: class SomeClass { Object field; } class SomeOtherClass { SomeClass instance = new SomeClass(); void method(){ Objects.requireNonNull(instance.field); } } 在本例中,SomeOtherClass.method
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))
但它并没有像我预期的那样起作用
我将代码提交给了
并实现了UnexpectedAccessCheck.visitMemberSelectExpression(MemberSelectExpressionTree)
,仅带有调试输出。在控制台上对一些线路运行测试:
[main] DEBUG d.t.s.p.v.c.UnexpectedAccessCheck - visitMemberSelectExpression invoked. Name of the symbol of identifier: !unknownSymbol!
也许,这个问题与
?
我使用sonar java插件的3.7.1版本和sonar插件api的5.1版本
您有什么提示吗?您应该为此使用语义API。在要检查的标识符上(这里是您应该通过memberSelectExpression访问的
字段
),使用IdentifierTree的symbol()
方法获取相关符号
在返回的符号上,您可以使用isPackageVisibility()
方法确定此字段的可见性(您还可以使用一系列其他方法处理符号) 不幸的是,这一暗示无助于解决问题。来自的UnexpectedAccessCheckTest
由于此失败案例而失败:UnexpectedAccessCheckTestClassCaller.defaultAccesMember()
访问一些字段(callee.visibleForAll)和(callee.visibleForTesting)。还有一些!未知符号要查看的调试输出中的代码>。