亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

從定義最簡單Findbugs Detector做起

系統 1872 0

創建Eclipse項目

在eclipse中新建一個Java項目,使用jdk 1.7,從版本3.0開始Findbugs要求Java 7。項目名稱符合Java項目名即可,這里以FB Plugin為例。

clip_image001

設置CLASSPATH

為了開發一個detector,我們需要對FindBugs的detector進行擴展,這里要使用到FindBugs的一些jar包。下載最新版本的FindBugs,在lib目錄下找到findbugs.jar, bcel.jar,并將其添加到項目FB Plugin 的Build Path中。

clip_image003

編寫BUG Detector

這里介紹一個FindBugs的例子(DMI_BIGDECIMAL_CONSTRUCTED_FROM_DOUBLE),用來檢測BigDecimal實例使用Double進行構造。

      BigDecimal a = 
      
        new
      
       BigDecimal(0.1);
    

實際a值為:0.1000000000000000055511151231257827021181583404541015625。

具體代碼如下:

      
        package
      
      
         com.cqu.edu.test;




      
      
        import
      
      
         java.math.BigDecimal;




      
      
        import
      
      
         edu.umd.cs.findbugs.BugInstance;


      
      
        import
      
      
         edu.umd.cs.findbugs.BugReporter;


      
      
        import
      
      
         edu.umd.cs.findbugs.OpcodeStack;


      
      
        import
      
      
         edu.umd.cs.findbugs.bcel.OpcodeStackDetector;




      
      
        public
      
      
        class
      
       DetectorTutorial 
      
        extends
      
      
         OpcodeStackDetector {

    

    
      
      
        private
      
      
         BugReporter bugReporter;



    
      
      
        public
      
      
         DetectorTutorial(BugReporter bugReporter) {

        
      
      
        this
      
      .bugReporter =
      
         bugReporter;

    }



    @Override

    
      
      
        public
      
      
        void
      
       sawOpcode(
      
        int
      
      
         seen) {

        
      
      
        //
      
      
         TODO Auto-generated method stub
      
      
        if
      
       (seen == INVOKESPECIAL && getClassConstantOperand().equals("java/math/BigDecimal"
      
        )

                
      
      && getNameConstantOperand().equals("<init>") && getSigConstantOperand().equals("(D)V"
      
        )) {

            OpcodeStack.Item top 
      
      = stack.getStackItem(0
      
        );

            Object value 
      
      =
      
         top.getConstant();

            
      
      
        if
      
       (value 
      
        instanceof
      
      
         Double) {

                
      
      
        double
      
       arg =
      
         ((Double) value).doubleValue();

                String dblString 
      
      =
      
         Double.toString(arg);

                String bigDecimalString 
      
      = 
      
        new
      
      
         BigDecimal(arg).toString();

                
      
      
        boolean
      
       ok = dblString.equals(bigDecimalString) || dblString.equals(bigDecimalString + ".0"
      
        );



                
      
      
        if
      
       (!
      
        ok) {

                    
      
      
        boolean
      
       scary = dblString.length() <= 8 && dblString.toUpperCase().indexOf("E") == -1
      
        ;

                    bugReporter.reportBug(
      
      
        new
      
       BugInstance(
      
        this
      
      , "TUTORIAL_BUG", scary ?
      
         NORMAL_PRIORITY : LOW_PRIORITY)

                            .addClassAndMethod(
      
      
        this
      
      ).addString(dblString).addSourceLine(
      
        this
      
      
        ));

                }

            }

        }

    }



}
      
    

部署和測試

FindBugs的插件是一個jar包,但至少需要包含findbugs.xml兩個messages.xml文件,將這兩個文件置于FB Plugin項目的根目錄下。

findbugs.xml告訴告訴FindBugs你的插件的內容,及如何加載它:

      
        <
      
      
        FindbugsPlugin 
      
      
        xmlns:xsi
      
      
        ="http://www.w3.org/2001/XMLSchema-instance"
      
      
        

        xsi:noNamespaceSchemaLocation
      
      
        ="findbugsplugin.xsd"
      
      
         

        pluginid
      
      
        ="com.cqu.edu.test.pluginTest"
      
      
        

        provider
      
      
        ="FindBugs Test"
      
      
         

        website
      
      
        ="http://findbugs.sourceforge.net"
      
      
        >
      
      
        <
      
      
        Detector 
      
      
        class
      
      
        ="com.cqu.edu.test.DetectorTutorial"
      
      
         reports
      
      
        ="TUTORIAL_BUG"
      
      
        />
      
      
        <
      
      
        BugPattern 
      
      
        type
      
      
        ="TUTORIAL_BUG"
      
      
         abbrev
      
      
        ="TU"
      
      
         category
      
      
        ="CORRECTNESS"
      
      
        />
      
      
        </
      
      
        FindbugsPlugin
      
      
        >
      
    

messages.xml包括了該插件的英文描述,和其報告的bug pattern:

      
        <?
      
      
        xml version="1.0" encoding="UTF-8"
      
      
        ?>
      
      
        <
      
      
        MessageCollection 
      
      
        xmlns:xsi
      
      
        ="http://www.w3.org/2001/XMLSchema-instance"
      
      
        

        xsi:noNamespaceSchemaLocation
      
      
        ="messagecollection.xsd"
      
      
        >
      
      
        <
      
      
        Plugin
      
      
        >
      
      
        <
      
      
        ShortDescription
      
      
        >
      
      FindBugs Plugin Tutorial Plugin
      
        </
      
      
        ShortDescription
      
      
        >
      
      
        <
      
      
        Details
      
      
        >
      
      Provides detectors as part of the FindBugs detector plugin tutorial.
      
        </
      
      
        Details
      
      
        >
      
      
        </
      
      
        Plugin
      
      
        >
      
      
        <
      
      
        Detector 
      
      
        class
      
      
        ="com.cqu.edu.test.DetectorTutorial"
      
      
        >
      
      
        <
      
      
        Details
      
      
        >
      
      
        

                        Finds instances of BigDecimals being created

                        with doubles.

                
      
      
        </
      
      
        Details
      
      
        >
      
      
        </
      
      
        Detector
      
      
        >
      
      
        <
      
      
        BugPattern 
      
      
        type
      
      
        ="TUTORIAL_BUG"
      
      
        >
      
      
        <
      
      
        ShortDescription
      
      
        >
      
      BigDecimal created from double
      
        </
      
      
        ShortDescription
      
      
        >
      
      
        <
      
      
        LongDescription
      
      
        >
      
      BigDecimal created from double in {1}
      
        </
      
      
        LongDescription
      
      
        >
      
      
        <
      
      
        Details
      
      
        >
      
      
        <![CDATA[
      
      
        

<p>Due to the way double-precision floating point values are represented in Java, creating a new BigDecimal from a double is unreliable and may produce surprising results.</p>


      
      
        ]]>
      
      
        </
      
      
        Details
      
      
        >
      
      
        </
      
      
        BugPattern
      
      
        >
      
      
        <
      
      
        BugCode 
      
      
        abbrev
      
      
        ="TU"
      
      
        >
      
      Tutorial
      
        </
      
      
        BugCode
      
      
        >
      
      
        </
      
      
        MessageCollection
      
      
        >
      
    

將FB Plugin項目build為jar包,勾選圖中文件:

clip_image004

將打包的jar文件放到FindBugs的plugin目錄下,在運行FindBugs時即可被調用。

原文鏈接: https://code.google.com/p/findbugs/wiki/DetectorPluginTutorial

從定義最簡單Findbugs Detector做起


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 色多多h| 黄色片在线观看网站 | 国产中文字幕在线免费观看 | 国产在线观看99 | 天天操夜夜摸 | 久久精品中文字幕首页 | 五月婷婷色视频 | 国产精品免费视频一区 | 亚洲欧美日韩综合精品网 | 久久久久久天天夜夜天天 | 青娱乐伊人| 伊人久久波多野结衣中文字幕 | 99久久国产综合精品成人影院 | www.欧美xxx | 日日拍夜夜嗷嗷叫狠狠 | a亚洲欧美中文日韩在线v日本 | 99热久久国产精品这里有6 | 国产成人lu在线视频 | 妞干网这里只有精品 | 婷婷综合色伊人阁 | 伊人影院在线视频 | 欧美一级网| 一级毛片美国一级j毛片不卡 | 91福利国产在线观看一区二区 | 99re这里只有精品国产精品 | 男人在线影院 | 国产免费播放一区二区 | 在线免费国产视频 | 天天做天天爱夜夜爽女人爽宅 | 国产欧美日韩高清专区ho | 日本大片久久久高清免费看 | 四虎永久免费地址ww417 | 在线日韩亚洲 | 日本乱人伦片中文字幕三区 | 在线亚洲小视频 | se色综合视频 | 深夜成人性视频免费看 | 欧美成年黄网站色高清视频 | 欧美伦理一区 | 亚洲国产婷婷综合在线精品 | 91精品国产综合久久婷婷 |