Sonar 5.6.4结合SonarJS如何获取参数?及NoSuchMethodError问题求助
嘿,我来帮你搞定这两个SonarJS的问题,先从你碰到的那个错误说起吧!
一、解决
java.lang.NoSuchMethodError错误 你遇到的这个报错核心原因是**Sonar 5.6.4配套的SonarJS版本(属于2.x系列)**里,CallExpressionTree并没有argumentClause()这个方法——这个方法是后续高版本SonarJS(比如3.x及以上)才新增的API。在5.6.4对应的旧版本中,获取调用参数的正确方法是arguments(),它返回的是List<ExpressionTree>,而非高版本里的ArgumentListTree。
给你修正后的代码片段:
public void visitCallExpression(CallExpressionTree tree) { if (tree.callee() instanceof DotMemberExpressionTree){ DotMemberExpressionTree dmTree = (DotMemberExpressionTree) tree.callee(); System.out.println(tree); if (isLionGetProperty(dmTree)) { // 替换为低版本支持的arguments()方法 List<ExpressionTree> args = tree.arguments(); // 后续处理参数的逻辑示例 if (!args.isEmpty()) { ExpressionTree firstArgument = args.get(0); // 这里可以根据参数类型做进一步处理 } } } }
二、Sonar 5.6.4的SonarJS中获取调用参数的正确方式
在这个版本的SonarJS里,获取函数调用参数的步骤很清晰:
- 在
visitCallExpression方法中,通过tree.arguments()拿到参数列表,它的返回类型是List<ExpressionTree> - 你可以通过索引(比如
get(0))获取单个参数,或者遍历整个列表处理所有参数 - 如果需要判断参数的具体类型(比如字符串字面量、标识符等),用
instanceof匹配对应的Tree子类即可
举个实用的例子,比如获取第一个参数并根据类型输出内容:
public void visitCallExpression(CallExpressionTree tree) { List<ExpressionTree> arguments = tree.arguments(); if (!arguments.isEmpty()) { ExpressionTree firstArg = arguments.get(0); // 处理字符串字面量参数 if (firstArg instanceof StringLiteralTree) { StringLiteralTree stringArg = (StringLiteralTree) firstArg; System.out.println("第一个参数是字符串,值为:" + stringArg.value()); } // 处理标识符参数 else if (firstArg instanceof IdentifierTree) { IdentifierTree idArg = (IdentifierTree) firstArg; System.out.println("第一个参数是标识符,名称为:" + idArg.name()); } } }
内容的提问来源于stack exchange,提问作者laozhuking
相关产品推荐
相关产品推荐

