好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

FindBugs检测器实现(2)

FieldDescriptor getFieldDescriptor() public MethodDescriptor getMethodDescriptor() public ClassDescriptor getClassDescriptor() public @SlashedClassName String getClassName() public void visitAfter(Code obj) public void visitAfter(JavaClass obj)

 

来个例子
 public   class  DemoPlugin  extends   PreorderDetector {
      private   BugReporter bugReporter;
    
      public   DemoPlugin(BugReporter reporter){
        bugReporter  =  reporter;
    }

      public   boolean   hasHashcode;
      public   boolean   hasEqual;
      public   MethodAnnotation equals;
    
    @Override
      public   void   visit(JavaClass obj){
        System.out.println( "visit class!!!!!!!!!" +  obj.getClassName());
        hasHashcode  =  false  ;
        hasEqual  =  false  ;
        equals  =  null  ;
    }
    
    @Override
      public   void   visit(Method me){
          if (! me.isPublic())
              return  ;
          if ("equals".equals(me.getName()) && "(Ljava/lang/Object;)Z" .equals(me.getSignature())){
            hasEqual  =  true  ;
            System.out.println( "find equals() method" );
            equals  = MethodAnnotation.fromVisitedMethod( this  );
        }
        
          if ("hashCode".equals(me.getName()) && "()I" .equals(me.getSignature())){
            hasHashcode  =  true  ;
            System.out.println( "find hashCode() method" );
        }
        
          if ("hashcode".equals(me.getName()) && "()I" .equals(me.getSignature())){
            bugReporter.reportBug(  new  BugInstance( this , "HASHCODE WRONG SPELL" , NORMAL_PRIORITY).
                    addClass(getDottedClassName()).addMethod(MethodAnnotation.fromVisitedMethod(  this  )));
        }
    }
    
    @Override
      public   void   visitAfter(JavaClass obj){
          if (hasEqual && ! hasHashcode){
            BugInstance instance  =  new  BugInstance( this , "EQUALS WITHOUT HASHCODE" , NORMAL_PRIORITY).
                    addClass(getDottedClassName()).addMethod(equals);
            bugReporter.reportBug(instance);
        }
    }
} 

这里我们继承了PreorderDetector,而PreorderDetector继承了PreorderVisitor,是因为BugInstance需要使用Detector进行实例,而PreorderDetector实现了Detector接口。

上面方法我们使用了上个变量hasHashcode,hasEquals和equals,前两个变量用来保存当前访问的类是否存在hashCode和equals方法,第三个变量存放的是方法注释(要在报告bug中,这里先不管)。

上述三个变量每次都在visit(JavaClass obj)方法中进行状态重置,这样才能对所有的类都进行检测。visit(Method me)方法中用来判断是否是equals、hashCode、hashcode方法,并修改相应的状态。如果是hashcode方法,则直接将该bug报告。

visitAfter(JavaClass obj)方法执行时,已经对当前类检测完毕,这样可以判断是否出现equals方法,而没有出现hashCode方法的情况。

将fandbugs.xml和massage.xml加到项目中打包,便能对我们定义的模式进行检测。

以上仅是一个自定义在类、方法、字段层面上的检测器的一般步骤,例子仅是为了说明过程,只要我们熟悉我们想要检测的模式,就能通过上述方法实现。

FindBugs检测器实现(2)

标签:

查看更多关于FindBugs检测器实现(2)的详细内容...

  阅读:27次

上一篇: northwind数据库

下一篇:SQL 循环 FOR 语句