程序员的量化交易之路(11)--命令参数解析库JCommonder学习

jcommander:Java的命令行解析框架 指挥官 这是Java 8的基于注释的参数解析框架。 这是一个简单的示例: public class JCommanderTest { @Parameter public List< String> parameters = Lists . newArrayList(); @Parameter ( names = { " -log " , " -verbose " }, description = " Level of verbosity " ) public Integer verbose = 1 ; @Parameter ( names = " -groups " , description = " Comma-separated list of group names to be run " ) public String grou 立即下载

转载须注明出处:http://blog.youkuaiyun.com/minimicall?viewmode=contents,http://cloudtrade.top

在学习量化交易平台的过程中,接触到一个参数解析的库,JCommander。今天把它记录一下。

它的官网为:http://www.jcommander.org/


1. 概述

Jcommander是一个非常小的框架,用于解析命令行参数。

可以通过注解来描述你的参数选项:

import com.beust.jcommander.Parameter;
 
public class JCommanderExample {
  @Parameter
  private List<String> parameters = new ArrayList<String>();
 
  @Parameter(names = { "-log", "-verbose" }, description = "Level of verbosity")
  private Integer verbose = 1;
 
  @Parameter(names = "-groups", description = "Comma-separated list of group names to be run")
  private String groups;
 
  @Parameter(names = "-debug", description = "Debug mode")
  private boolean debug = false;
}
然后你可以通过下面代码来解析命令行参数:

JCommanderExample jct = new JCommanderExample();
String[] argv = { "-log", "2", "-groups", "unit" };
new JCommander(jct, argv);
 
Assert.assertEquals(jct.verbose.intValue(), 2);

2. 参数类型

你的参数可以是任何类型的。内置类型(Integer,Boolean,等),这些是默认就支持的,当然你可以写一个类型转换器来支持任意你想要支持的类型。

Boolean

@Parameter(names = "-debug", description = "Debug mode")
private boolean debug = false;

如果你想定义一个布尔参数,在默认情况下为真,您可以声明它的参数数量arity 为1。用户将需要显式地指定他们想要的值。

下面程序就是命令行的一个解析案例:

program -debug true
program -debug false

String,Integer,Long

JCommander支持String,Integer,Long类型的解析。

例如:

@Parameter(names = "-log", description = "Level of verbosity")
private Integer verbose = 1;

java Main -log 3

上面的verbose 会接收到3.

当然,下面句子就会抛出异常:

java Main -log test

Lists

当Parameter注解放在一些列表List上时,那么JCommander会理解为该参数可以出现很多次。

@Parameter(names = "-host", description = "The host")
private List<String> hosts = new ArrayList<String>();

java Main -host host1 -verbose -host host2

Password

有时候你不想一个参数明文显示和出现在历史记录里面,比如输入的密码。这个时候你就可以将其配置为密码类型,只需要把password开关打开。

public class ArgsPassword {
  @Parameter(names = "-password", description = "Connection password", password = true)
  private String password;
}

当你执行程序时,就会有下面的提示:

Value for -password (Connection password):

当然,你也可以选择显示输入的密码,将echoInput设置为true:

public class ArgsPassword {
  @Parameter(names = "-password", description = "Connection password", password = true, echoInput = true)
  private String password;
}

3. 自定义类型

通过注解(By annotation)

JCommander是支持内置类型的参数配置。但更多时候吧,你需要输入一些更为复杂的类型。比如说,文件、主机名、列表等。。。。为了达到这个目的,你需要自己去实现下面这个转换接口:

public interface IStringConverter<T> {
  T convert(String value);
}

例如,下面是一个将string转换为File(文件)的转换器:

public class FileConverter implements IStringConverter<File> {
  @Override
  public File convert(String value) {
    return new File(value);
  }
}

然后呢,你就可以将该转换器通过Parameter注解的converter参数进行配置:

@Parameter(names = "-file", converter = FileConverter.class)
File file;

JCommander支持一些常用的转换器(例如都好分割的字符串转成List<String>)


By factory(通过工厂)

上面的File file 用一次,就得使用一次converter=FileConverter.class。好麻烦不?如果要用多次,能不能省掉它呢。可以。

需要通过下面接口:

public interface IStringConverterFactory {
  <T> Class<? extends IStringConverter<T>> getConverter(Class<T> forType);
}

我们看下面这个例子,需要解析一个host:port参数:

java App -target example.com:8080

你需要定义下面holder类:

public class HostPort {
  private String host;
  private Integer port;
}

converter转换器类:

class HostPortConverter implements IStringConverter<HostPort> {
  @Override
  public HostPort convert(String value) {
    HostPort result = new HostPort();
    String[] s = value.split(":");
    result.host = s[0];
    result.port = Integer.parseInt(s[1]);
 
    return result;
  }
}

工厂类:

public class Factory implements IStringConverterFactory {
  public Class<? extends IStringConverter<?>> getConverter(Class forType) {
    if (forType.equals(HostPort.class)) return HostPortConverter.class;
    else return null;
  }

使用:

public class ArgsConverterFactory {
  @Parameter(names = "-hostport")
  private HostPort hostPort;
}

看到了吧,没有再用converter参数了。

当然,你需要将工厂缴入到JCommander对象中:

ArgsConverterFactory a = new ArgsConverterFactory();
JCommander jc = new JCommander(a);
jc.addConverterFactory(new Factory());
jc.parse("-hostport", "example.com:8080");
 
Assert.assertEquals(a.hostPort.host, "example.com");
Assert.assertEquals(a.hostPort.port.intValue(), 8080);

4. 参数验证

你可以通过下面的接口来做一些早期的参数验证工作:

public interface IParameterValidator {
 /**
   * Validate the parameter.
   *
   * @param name The name of the parameter (e.g. "-host").
   * @param value The value of the parameter that we need to validate
   *
   * @throws ParameterException Thrown if the value of the parameter is invalid.
   */
  void validate(String name, String value) throws ParameterException;
}

下面这例子就能够保证输入的数字一定大于等于0,即正数:

public class PositiveInteger implements IParameterValidator {
 public void validate(String name, String value)
      throws ParameterException {
    int n = Integer.parseInt(value);
    if (n < 0) {
      throw new ParameterException("Parameter " + name + " should be positive (found " + value +")");
    }
  }
}
使用例子:

@Parameter(names = "-age", validateWith = PositiveInteger.class)
private Integer age;



5 主参数(Main parameter)

到目前为止,你会发现每个参数都有一个names参数。JCommander允许且只允许你配置一个没有名字的参数,它会接受所有没有名字的参数。

例如:

@Parameter(description = "Files")
private List<String> files = new ArrayList<String>();
 
@Parameter(names = "-debug", description = "Debugging level")
private Integer debug = 1;

解析:

java Main -debug file1 file2

那么 files域会接收到"file1","file2"。

6. 私有参数(Private parameters)

参数可以是私有的:

public class ArgsPrivate {
  @Parameter(names = "-verbose")
  private Integer verbose = 1;
 
  public Integer getVerbose() {
    return verbose;
  }
}
ArgsPrivate args = new ArgsPrivate();
new JCommander(args, "-verbose", "3");
Assert.assertEquals(args.getVerbose().intValue(), 3);


7. 参数分隔符(Parameter separators)

默认情况下,参数是通过空白符分割的。但你可以改变为:

java Main -log:3

或者:

java Main -level=42

你可以定义分隔符:

@Parameters(separators = "=")
public class SeparatorEqual {
  @Parameter(names = "-level")
  private Integer level = 2;
}

8. 多描述(Multiple description)

直接上例子吧:

public class ArgsMaster {
  @Parameter(names = "-master")
  private String master;
}

public class ArgsSlave {
  @Parameter(names = "-slave")
  private String slave;
}

ArgsMaster m = new ArgsMaster();
ArgsSlave s = new ArgsSlave();
String[] argv = { "-master", "master", "-slave", "slave" };
new JCommander(new Object[] { m , s }, argv);
 
Assert.assertEquals(m.master, "master");
Assert.assertEquals(s.slave, "slave");

9. @语法

JCommander支持@语法,允许你将参数写到文件里面,然后通过@符加载。例如:


-verbose
file1
file2
file3

java Main @/tmp/parameters

10. Arities(参数的多个值)

一个参数会接收多个值,例如:

java Main -pairs slave master foo.xml

这个-pairs需要接收2个值,(也就是不需要foo.xml),那么需要定义arity=2,如下:
@Parameter(names = "-pairs", arity = 2, description = "Pairs")
private List<String> pairs;

当然,内置类型都不需要定义这个参数。

你可以定义参数接收无限个值,例如:

program -foo a1 a2 a3 -bar
program -foo a1 -bar

即,变长的,他需要设定variableArity参数:

@Parameter(names = "-foo", variableArity = true)
public List<String> foo = new ArrayList<String>();

11. 为参数取多个名字

你可以为一个参数取多个名字:

@Parameter(names = { "-d", "--outputDirectory" }, description = "Directory")
private String outputDirectory;

下面都是可以的:

java Main -d /tmp
java Main --outputDirectory /tmp


好了,还有更多的细节,读者可以自行到其官网学习了。今天就到这里。。。。。。











JCommon jar包 JCommon是一组有用的classes集合.它已经用在JFreeChart,JFreeReport与其它项目上. 这个类库包含了以下功能: * 文本工具类(text utilities), * 用来显示关于应用程序信息的用户界面类, * 布局定制管理器, * 一个日期选择面板, * 序列化工具类, * XML解析器支持类. 立即下载

相关推荐

seata学习–命令行启动参数解析(JCommander)

今天在看seata源码的时候,看到server的的启动能接收命令行参数,以前也经常用命令行启动的方式,但是今天才真正的去了解这么一个大神器: JCommander JCommander是一个用于解析命令行参数的Java框架,支持解析所有基本的数据类型,也支持将命令行解析成用户自定义的类型,只需要写一个转变函数。 首先我们来看下seata的源码: @Parameter(names = --help, help = true) private boolean help; @Parameter(names = {--host, -h}, description =

JCommander学习总结

JCommander介绍 JCommander是一个小型的java框架,它用来解析命令行参数。 比如下面的代码: import com.beust.jcommander.Parameter; ​ public class Args { @Parameter private List<String> parameters = new ArrayList<>(); ​ @Parameter(names = { "-log", "-verbose" }, ...

pandeng6032的博客 3076

Ubuntu22.04 apt 安装 ROS1 ROS Noetic Ninjemys

ubuntu 22.04 apt-get 安装 ros1 ros Noetic 最新版

autolabor的博客 5万+

Java 命令行开发工具-JCommander(新手入门)

JCommander 的使用

qq_41527446的博客 1756

基于Mind+、MOTT实现人工智能

@基于Mind+、MOTT实现人工智能 人工智能实验 一、实验目的及要求 【一】实现人脸识别 【二】实现云数据库应用 【三】实现测温数据mqtt上传至物联网云平台 二、实验原理与内容 基于二哈实现多人人脸学习和识别 基于TinywebDB实现云数据库应用 基于EasyIoT实现mqtt数据上传。 三、实验软硬件环境 硬件:掌控板 软件:Mind+ 四、实验过程(实验步骤、记录、数据、分析) 1.基于二哈实现多人人脸学习和识别 ①在Mind+扩展上的传感器选项选择HUSKYLENS AI 摄像头 ②配置哈士

weixin_44606930的博客 2376

从零实战:基于华中8型数控系统的CNC数据采集与二次开发

本文详细介绍了基于华中8型数控系统的CNC数据采集与二次开发实战指南。从开发环境准备到核心数据采集实现,涵盖Windows平台配置、实时数据采集、报警处理等关键技术,帮助开发者快速掌握华中数控系统的数据采集能力,提升智能制造水平。

weixin_42561143的博客 813

JCommander(命令行参数解析工具)

Because life is too short to parse command line parameters. From JCommander official site: http://jcommander.org/

navyhu的专栏 1万+

79.ScottPlot的MVVM实现 C#例子 WPF例子

在你的 WPF 窗口的 XAML 文件中,定义一个,并将其Content属性绑定到 ViewModel 中的属性。这样可以将WpfPlot控件动态绑定到 ViewModel。

S13461120713的博客 2571

终极指南:5分钟掌握JCommander Java命令行参数解析利器

JCommander是一个小巧而强大的Java命令行参数解析框架,让开发者能够轻松处理复杂的命令行输入。无论你是构建CLI工具、服务器应用还是开发工具,JCommander都能帮你快速实现专业的命令行界面。🎯 ## 什么是JCommander? JCommander是一款专为Java开发者设计的命令行参数解析框架,它通过注解驱动的方式,让参数解析变得异常简单。只需几行代码,就能实现功能完整的

gitblog_00003的博客 660

基于Dify与DeepSeek构建中医智能问答工作流:从知识库到精准处方

本文详细介绍了如何利用Dify与DeepSeek构建中医智能问答工作流,实现从知识库构建到精准处方的全流程。通过模型编排和知识检索技术,系统能够结合中医辨证思维与AI推理能力,为基层医师、学生和爱好者提供结构化诊疗建议。文章重点分享了知识库选材、症状标准化处理、智能检索与辨证推理等核心环节的实战经验。

weixin_29062255的博客 251

STM32CubeMx+stm32f407+FreeRTOS+LAN8720实现LWIP以太网UDP TCP数据收发功能

单片机实现LWIP的调试

qq_40600203的博客 3070

Java:使用JCommander解析命令行参数

译文:JCommander是一个非常小的Java框架,它使得解析命令行参数变得微不足道。完整 pom.xml配置。

彭世瑜的博客 1255

MS51内部振荡器

MS51内部有两个RC振荡器,一个高速16MHz或24MHz(HIRC),可通过HIRC24(RCTRIM1.4)位进 行选择配置,以及一个低速10 kHz(LIRC)。它们都可被选择用作系统时钟。通过设置HIRCEN (CKEN.5)位使能HIRC,设备上电时LIRC被使能。用户可设置OSC[1:0] (CKSWT [2:1])为[0,0]选择HIRC 作为系统时钟,设置OSC[1:0](CKSWT [1:0])为[1,0]选择LIRC作为系统时钟。注意:MS51上电后HIRC 和 LIRC都被...

seraphseraphhill2008的博客 808

java接口 传外参_JCommander:Java外部参数解析利器

13/Mar 2015最近需要把项目交给别人进行运维,为了不让接手之人涉及太多繁琐细节,我把一些定义在final类中的不可变量抽取出来,把项目变成可外部配置的。用配置文件可以达到这个目的,但由于配置之间有相互依赖关系,比如:public static boolean local = false;public static String host = (local) ? "127.0.0.1" :...

weixin_39721807的博客 455

2021.02.23丨Virsorter2安装使用及答疑

最近项目比较多,又在学英语,写文章的时间少了很多。最近接到一个病毒组装的项目。用之前组装工具(ABYSS、SPAdes)都没有能够组装较为完整的scafford,今天介绍一款专门用于组装病毒的工具——Virsorter。 Virsorter最早版本发布于2015年,目前已经有了第二个版本。主要用于病毒的组装的注释。详细情况可以查看文章:https://peerj.com/articles/985/ 安装流程 安装文档: https://github.com/jiarong/VirSorter2/b

4836

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

使用 JCommander 解析命令行参数

如果你想构建一个支持命令行参数的程序,那么 jcommander 非常适合你,jcommander 是一个只有几十 kb 的 Java 命令行参数解析工具,可以通过注解的方式快速实现命令行参数解析。这篇教程会通过介绍 jcommadner ,快速的创建一个命令行程序,最后支持的命令参数功能如下图。查看命令帮助信息。查看当前版本号。通过 URL 克隆一个仓库。暂存 file1 文件 file2 文件。git-app.jar commit -m "注释"提交并添加注释。这是一种很常见的操作,

未读代码 718

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JCommander + AutoService打造带子命令的Java命令行应用

打造属于自己的命令行工具

曲折旅程,艰难人生 838

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

盘点Java界比较火的命令行程序开发工具:JCommander、picocli、SpringShell、JLine3

简单参数解析 →JCommander(快速上手)。复杂参数或多命令 →picocli(功能全面)。增强交互体验(如补全、历史) →JLine3(搭配其他解析工具)。Spring 项目或需要完整框架 →(整合一切,开箱即用)。写一个简单的文件处理工具(只需解析-input和-output参数)→ 用 JCommander。写一个类似git的多命令工具(git commitgit push)→ 用 picocli + JLine3。

秃了也弱了 1万+

Java命令行界面(第7部分):JCommander

这是我系列的第七篇文章,简要介绍了用于处理Java命令行参数的各种库。 这篇文章回到了基于注释的库的覆盖范围,该库似乎是在Java中可用于处理命令行参数的众多可用库中知名度最高的库之一,它更为流行。 JCommander的网页上指出:“因为生命太短,无法解析命令行参数”,并且概述将JCommander引入为“一个很小的Java框架,使得解析命令行参数变得微不足道。” 本文中的代码示例和执...

最佳 Java 编程 1618

【笔记】JCommander解析命令行参数

JCommander可以通过注解的方式解析命令行参数,非常方便,推荐尝试。 依赖 <dependency> <groupId>com.beust</groupId> <artifactId>jcommander</artifactId> <version>1.82</version> </dependency>

MrXionGe的博客 960

JCommander入门指南:5分钟学会Java命令行参数解析

JCommander是一个强大的Java命令行参数解析框架,能够帮助开发者轻松处理命令行输入,让Java应用程序的命令行交互变得简单高效。无论是构建工具、服务器应用还是桌面程序,JCommander都能显著简化参数解析的复杂度。 ## 什么是JCommander? JCommander是由Cédric Beust创建的开源Java库,它通过注解方式将命令行参数与Java对象属性绑定,极大简化了

gitblog_01144的博客 837

maven 到处包含maven jar 的jar包

&lt;build&gt; &lt;plugins&gt; &lt;plugin&gt; &lt;artifactId&gt;maven-assembly-plugin&lt;/artifactId&gt; &lt;configuration&gt; &...

myz的博客 304

Java命令行工具开发终极指南:JCommander、Args4j与Picocli框架深度对比

🚀 想要快速开发功能强大的Java命令行工具?本指南为您深度对比三大流行框架:JCommander、Args4j与Picocli,帮助您选择最适合的解决方案! Java命令行工具在现代软件开发中扮演着重要角色,从简单的脚本工具到复杂的系统管理程序,都需要高效处理命令行参数。本文将带您了解这三个框架的核心特性、使用场景和最佳实践,让您的Java命令行工具开发事半功倍。 ## 📊 三大框架概览

gitblog_00368的博客 565

自己动手写 Java 虚拟机(一)-编写命令行工具

本文是学习《自己动手写 Java 虚拟机》的第一篇学习笔记,将通过对该书的学习,一步一步使用 Java 语言编写 Java 虚拟机(作者使用的是 Go 语言),应该是很穷人版 Java 虚拟机,就是解析 Java 代码,然后编写执行引擎去执行这段代码。 跟随作者的脚步,首先基于 Java 实现一个命令行工具。 JCommander 这里使用 JCommander 实现一个命令行工具(Commons CLI 也可以)。 JCommander is a very small Java framework .

【欢迎关注公众号:冬瓜白】 923
上一篇: 程序员的量化交易之路(10)--金融概念Stop-limit Order
下一篇: 程序员的量化交易之路(12)--Guice库的学习
minimicall
博客等级 码龄18年 407粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值