本文中介绍的基于 Java 的命令行参数处理库是 IBM developerWorks 文章Java 编程动态,第 3 部分,应用反射的特色库(这篇 2003 年的文章是2016 年“存档”,但仍可用于PDF 下载)。该库名为 JArgp(Java 命令行参数处理库),在其主页 上定义为“用于处理命令行的库” Java 中的参数。”此页面补充说,“与大多数其他此类库不同,JArgp 使用反射将实际值直接存储到目标应用程序对象中的字段。” JArgp 1.0 在这篇文章中有特色。
JArgp 是一个简约的库,如 JArgp JAR 中的少量类所示。
“定义”阶段在 JArgp 中通过指定 ParameterDef 实例数组来完成。可以编写自定义类来扩展 ParameterDef
类,但我将能够使用此类的两个提供的扩展(StringDef 和 BoolDef ) 来实现本系列早期文章中实现的文件路径/名称和详细参数。下一个代码清单对此进行了举例说明(完整代码将在 GitHub 上提供)。
使用 JArgp 的“定义”阶段
private static final ParameterDef[] PARAMETERS_DEFINITIONS = { new StringDef('f', "file", "File path and name"), new BoolDef('v', "verbose", "Verbosity level") };
ParameterDef
的构造函数的初始参数 - 扩展类 StringDef
和 BoolDef
是将成为命令行标志的单个字符。在这种情况下,定义的命令行参数标志将为文件路径/名称的“-f”和冗长的“-v”。每个构造函数的第二个参数是类字段的名称,与命令行标志关联的任何值都将写入该字段。每个构造函数的第三个参数是对该命令行参数标志的描述。据我所知,无法指定“长”参数名称(在这种情况下无法指定 --file
或 --verbose
)。
“解析”阶段在 JArgp 中完成,调用静态 ArgumentProcessor 方法 processArgs(String[], ParameterDef[], Object)。这在下一个代码清单中得到了举例说明。
JArgp 中的“解析”
final Main instance = new Main(); // The integer returned by the next invocation is actually the // zero-based index of next argument to be processed final int numberArgumentsProcessed = ArgumentProcessor.processArgs( arguments, PARAMETERS_DEFINITIONS, instance);
JArgp 的“询问”阶段是通过访问实例中名称与参数定义中提供的字段相匹配的字段来实现的。这显示在下一个代码清单中。
JArgp 中的“审讯”阶段
out.println( "File path/name is " + instance.file + " and verbosity is " + instance.verbose);
到目前为止显示的代码的使用在下一个屏幕快照中进行了演示。
如果我想在定义命令行标志时应用我提供的描述,我可以使用 instance 方法方法进行解析,而不是之前显示的 static 函数方法.这在下一个代码清单中进行了演示。
final Main instance = new Main(); final ArgumentProcessor argumentProcessor = new ArgumentProcessor(PARAMETERS_DEFINITIONS); argumentProcessor.processArgs(arguments, instance); argumentProcessor.listParameters(50, out);
前面代码清单的最后一行演示了如何使用 ArgumentProcessor.listParameters(int, PrintStream) 方法将标志及其描述写入输出。此输出显示在下一个屏幕快照中。
在选择框架或库以帮助在 Java 中进行命令行解析时,需要考虑 Jargp 的一些特性。
JArgp 是一个用于处理 Java 命令行参数的简约库。默认情况下,它不支持“长”参数名称,并且不支持与本系列中介绍的其他一些库一样多的功能,但它体积小且易于使用。我将其包含在本系列中主要是因为它的背景与 IBM DeveloperWorks 文章 相关。
其他资源
标签2: Java教程地址:https://www.cundage.com/article/jcg-java-command-line-interfaces-part-16-jargp.html