【问题标题】:Find object's class查找对象的类
【发布时间】:2018-03-12 13:51:33
【问题描述】:

目前我的任务是在 SonarQube 中迁移一些规则。较旧的基于 PMD 和 Checkstyle 库。新的规则需要使用集成的 Sonar 规则(如大多数 squid 规则)编写。我目前正在处理的规则需要检查是否在循环中使用了名称中包含“Dao”的类中的任何方法。

我对规则迁移和声纳库的使用不是很有经验,所以我尝试使用 squid 规则中的一些部分,但我无法准确找到我需要的内容。

@Override
public void visitNode(Tree tree) {
   MethodInvocationTree methodInvocationTree = (MethodInvocationTree) tree;
   IdentifierTree methodName = methodName(methodInvocationTree);

   if ( methodClassContainsDaoInName(tree?) && insideLoop(tree?)) {
      reportIssue(methodName, "DAO methods should not be called inside loop");
   }
}

我仍然坚持第一种方法(methodClassContainsDaoInName())。目前我正在尝试获取方法和对象并检查该对象的类的名称中是否包含“Dao”。我使用这个命令:

tree.parent().firstToken().text();

这个命令找到我的对象,但只给我它的名字。我试着这样做:

tree.parent().firstToken().toClass();

但它给了我错误的类(如果我没记错的话它返回符号或令牌类)。

也许有人知道我怎样才能将该结果转换为正确的对象? 也许有人知道让这条规则生效的更好方法并可以分享一些例子?

【问题讨论】:

  • 我想你想要 Object.getClass().getName() 之类的东西
  • @MichaelPeacock nop,真的不是。所有信息都在语法树 API 中。
  • 是的,我想获取对象的类,但是这个规则需要是通用的,所以在检查项目之前我没有对象。这种方法适合我,但首先我需要找到那个对象(或多个对象)
  • 你试过methodInvocation.symbol().owner().name()吗?

标签: java sonarqube rule


【解决方案1】:

作为免责声明,我不会为您编写规则。一切都应该可以从 API 中获得(语法或语义)...一旦正确地制定了您在规则编写和概念方面的要求。

重新制定要求:您正在尝试验证类(对象...)拥有被调用方法是 DAO(又名所有者),如果是这样,请提出问题(如果它在循环中,但那是另一回事了)。

现在,从您已经拥有的methodInvocationTree 本身,访问其关联的symbol(API 中有一个symbol() 方法),然后是owner 符号,应该 成为拥有阶级。然后,您可以从所有者符号直接访问其name,并验证它是否包含“Dao”。

放入代码:

boolean methodFromDao = methodInvocationTree
  .symbol()
  .owner()
  .name()
  .contains("Dao");

重要提示:在语法 API 中,您使用了 SonarJava API 的另一个抽象级别,它使您可以访问符号。为了完成语义,SonarJava 在分析过程中需要访问字节码。如果未提供字节码,则语义引擎很可能无法解析方法。具体来说,就是所有的符号都是unknown,你无法知道它们的主人。

【讨论】:

  • 上周我尝试了一些带有符号的方法,但没有成功。我得到了名字:“对象”。我尝试了这段代码,它返回了相同的值。看起来主要问题出在我的测试项目中:我试图调用 testDao.toString(),它在我想获取 TestDao 时将 internDao 作为 Object 返回。当我尝试调用我自己在 TestDao 类中编写的另一个方法时,它返回“TestDao”类和“true”。谢谢
  • 这是合乎逻辑的...如果您调用从 java.lang.Object 继承的方法并且没有被覆盖。如果您覆盖 toString() 方法,那么您应该在寻找所有者时获取您的 TestDao 类。
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 2011-10-16
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 2018-09-05
相关资源
最近更新 更多