国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Commons CLI 入門及代碼簡單分析

Apollo / 2547人閱讀

摘要:入門中把解釋參數(shù)分為三種狀態(tài),分別是定義解釋和詢問交互。如果入?yún)⒚钆c實例對應(yīng)不上就會拋出解析異常。查詢交互可以對入?yún)⒚钸M(jìn)行判斷解析,例如可以查詢是否存在某個選項,以及獲取這個選項的值。

前言

以前寫過一些命令行程序,在需要帶參數(shù)的時候都是自己來判斷args,導(dǎo)致程序光解析args都占了好大一堆,而且解析代碼也不美觀。
偶然間發(fā)現(xiàn)了apache公共庫中的cli庫,在這里分享給大家。

入門

commons-cli中把解釋參數(shù)分為三種狀態(tài),分別是定義、解釋和詢問交互。

接下來,我以一個例子做一下說明:

maven庫:


        commons-cli
        commons-cli
        1.3.1

import org.apache.commons.cli.*;

public class CLI {
    public static void main(String[] args) throws ParseException {
        //定義
        Options options = new Options();
        options.addOption("h",false,"list help");//false代表不強(qiáng)制有
        options.addOption("t",true,"set time on system");

        //解析
        //1.3.1中已經(jīng)棄用針對不同格式入?yún)?yīng)的解析器
        //CommandLineParser parser = new PosixParser();
        CommandLineParser parser = new DefaultParser();
        CommandLine cmd = parser.parse(options,args);

        //查詢交互
        //你的程序應(yīng)當(dāng)寫在這里,從這里啟動
        if (cmd.hasOption("h")){
            String formatstr = "CLI  cli  test";
            HelpFormatter hf = new HelpFormatter();
            hf.printHelp(formatstr, "", options, "");
            return;
        }

        if (cmd.hasOption("t")){
            System.out.printf("system time has setted  %s 
",cmd.getOptionValue("t"));
            return;
        }

        System.out.println("error");
    }
}

在另一個類中做一下測試

String argss[]={"-t  1000"};
CLI.main(argss);

結(jié)果是:

system time has setted 1000

String argss[]={"-h"};
CLI.main(argss);

結(jié)果是:

usage: CLI cli test
-h list help
-t set time on system

好啦,入門就到這里了。

代碼結(jié)構(gòu)分析

包組織結(jié)構(gòu):

commons-cli-1.3.1.jar
org.apache.commons.cli

在cli包中,包含了所有的類,包括定義,解析,查詢交互和Exception

類的關(guān)系結(jié)構(gòu)圖如下

定義

在定義這一部分,最重要的類是Option,Option類中定義了一個基本的選項,例如-t xxx ,是否為必選項,該命令的解釋等等。

Option重寫了很多構(gòu)造函數(shù),但是最終都調(diào)用下面這個構(gòu)造函數(shù):

public Option(String opt, String longOpt, boolean hasArg, String description)
           throws IllegalArgumentException
    {
        //寫這個代碼的人以前應(yīng)該是寫C++的。。。
        // 判斷短選項是否包含非法字符,如果包含拋出異常
        OptionValidator.validateOption(opt);
        //短選項
        this.opt = opt;
        //長選項
        this.longOpt = longOpt;

        // 是否是必要選項
        if (hasArg)
        {
            this.numberOfArgs = 1;
        }
        //選項描述
        this.description = description;
    }

OptionsGroup類中包含了許多個Option,并可以對多個Option進(jìn)行一些處理。其實現(xiàn)是采用一個HashMap來存儲Option的,key是Option中的長選項或者短選項的第一個字符,如果短選項存在,則優(yōu)先選擇短選項。

OptionGroup類還包含了一個組描述和組是否必須存在,相當(dāng)于對一群Option的群組操作。

Options類是被解析的對象,使用者可以在Options實例中直接添加命令,也可以添加Option實例,也可以添加OptionGroup實例。

其addOption方法最終調(diào)用了其重寫的一個方法:

public Options addOption(Option opt)
    {
        String key = opt.getKey();

        // add it to the long option list
        if (opt.hasLongOpt())
        {
            longOpts.put(opt.getLongOpt(), opt);
        }

        // if the option is required add it to the required list
        if (opt.isRequired())
        {
            if (requiredOpts.contains(key))
            {
                requiredOpts.remove(requiredOpts.indexOf(key));
            }
            requiredOpts.add(key);
        }

        shortOpts.put(key, opt);

        return this;
    }

添加GroupOption方法如下:

public Options addOptionGroup(OptionGroup group)
    {
        if (group.isRequired())
        {
            requiredOpts.add(group);
        }

        for (Option option : group.getOptions())
        {
            // an Option cannot be required if it is in an
            // OptionGroup, either the group is required or
            // nothing is required
            option.setRequired(false);
            addOption(option);

            optionGroups.put(option.getKey(), group);
        }

        return this;
    }
解析

接下來就是CommandLineParser接口,在1.3.1版本中取消了Parser抽象類,GnuParserBasicParserPosixParser類,取而代之的是DefaultParser類。DefaultParser類提供了對Options實例的解析,即對入?yún)⒚詈蚈ptions實例之間對應(yīng)關(guān)系的解析,返回的類是CommandLine。如果入?yún)⒚钆cOptions實例對應(yīng)不上就會拋出解析異常。

DefaultParser類解析方法最基本的方法是handleToken(String token),token是每一個入?yún)⒆址_@個方法會在解析錯誤的時候拋出解析異常。

查詢交互

CommandLine可以對入?yún)⒚钸M(jìn)行判斷解析,例如可以查詢是否存在某個選項,以及獲取這個選項的值。

總結(jié)

cli包還是相當(dāng)簡單的,大家也可以自己看一看commons庫的源碼。

更多文章:http://blog.gavinzh.com

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/65114.html

相關(guān)文章

  • 180718-jar包執(zhí)行傳參使用小結(jié)

    摘要:包執(zhí)行時傳參的使用姿勢雖說我們現(xiàn)在大多不太直接使用包運(yùn)行方式,目前比較主流的是將自己的服務(wù)丟在某個容器中如,等運(yùn)行,比如我之前所屬的電商公司,就是將項目打包為包,丟到容器中運(yùn)行的在使用時,可能會出現(xiàn)直接打包一個可執(zhí)行的,然后運(yùn)行,這種時候, showImg(https://segmentfault.com/img/remote/1460000015684728); jar包執(zhí)行時傳參的...

    red_bricks 評論0 收藏0
  • #yyds干貨盤點(diǎn)# Spring Boot的前世今生以它和Spring Cloud的關(guān)系詳解。

    摘要:經(jīng)過年時間的發(fā)展,到目前為止,最新穩(wěn)定版為版本。的發(fā)展剛出生的時候,引起了很多開源社區(qū)的關(guān)注,并且也有個人和企業(yè)開始嘗試使用。通過項目搭建過程來對比的差異和優(yōu)勢。當(dāng)然它的作用不僅于此,后續(xù)會逐步揭開它的真實面目。而和就相當(dāng)于當(dāng)年的和的關(guān)系。 要了解Spring Boot的發(fā)展背景,還得從2004年Spring ...

    番茄西紅柿 評論0 收藏2637
  • 強(qiáng)推!大牛程序員必備的Java日志框架,性能無敵

    摘要:本文要來分享給大家程序員最常用的日志框架組件。沒有基礎(chǔ)的同學(xué)也不要著急,這套教程覆蓋了目前所有的日志框架,只要你學(xué),就一定用得到,先收藏,以備不時之需。 作為一名Java程序員,我們開發(fā)了很多Java應(yīng)用程序,包括桌面應(yīng)用、WEB應(yīng)用以及移動應(yīng)用。然而日志系統(tǒng)是一個成熟Java應(yīng)用所必不可少的。在開發(fā)和調(diào)試階段,日志可以幫...

    zebrayoung 評論0 收藏0
  • 關(guān)于Vue2一些值得推薦的文章 -- 五、六月份

    摘要:五六月份推薦集合查看最新的請點(diǎn)擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...

    sutaking 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<