Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Sonar规则中检测类成员(字段)访问_Java_Sonarqube - Fatal编程技术网

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

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

在编写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))
但它并没有像我预期的那样起作用

我将代码提交给了 并实现了
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)。还有一些
!未知符号