gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:35:18 26 4
gpt4 key购买 nike

在编写 Sonar-rule (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

我用的是3.7.1的sonar-java-plugin和5.1的sonar-plugin-api。

你有什么提示给我吗?

最佳答案

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

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

关于java - 如何检测 Sonar 规则中的类成员(字段)访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33893892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com