【读码练习/args4j】(一) 概述
args4j 一个利用java5特性实现命令行处理的开源框架
下面的是源码里的一个TestCase。可以了解它的使用方法和大概流程:
第2、5行 通过java5的annotation定义命令参数和存储参数值
第9行 通过CmdLineParser解析MandatoryOptionTest
第10行 解析命令参数、赋值到MandatoryOptionTest实例
(赋值完命令参数会后调用bean的一个run方法(约定),这个例子没有体验,但这不是重点)
1 public class MandatoryOptionTest extends TestCase {
2 @Option(required=true,name="-a")
3 int x;
4
5 @Option(name="-b")
6 int y;
7
8 public void test1() throws Exception {
9 CmdLineParser p = new CmdLineParser(this);
10 p.parseArgument("-a","3","-b","2");
11 assertEquals(x,3);
12 assertEquals(y,2);
13
14 p = new CmdLineParser(this);
15 try {
16 p.parseArgument("-b","2");
17 fail();
18 } catch(CmdLineException e) {
19 System.out.println(e.getMessage());
20 assertTrue(e.getMessage().contains("-a"));
21 }
22 }
23 }
解析命令的定义和赋值
1、解析命令定义
1 @Option(required=true,name="-a")
2 int x;
所谓解析命令定义就是读取定义类的field或者method上的annotation和被标注的field或者method,然后封装起来。
以上面为例:
A、这个叫做Option的annotation的各种信息会被封装到一个OptionDef
B、把int x这个field连同实例一起封装的setter。
分成FieldSetter,MethodSetter(如果标注在方法上)
C、把Setter和OptionDef封装到一个OptionHandler
根据setter的getType方法返回的类型决定具体的OptionHandler具体的子类
D、所有解析出得OptionHandler会被存放在CmdLineParser的一个list里
2、解析、赋值参数。
p.parseArgument("-a","3","-b","2");
参数是一个数组,封装在一个CmdLineImpl里。CmdLineImpl里还有一个Pos变量标记处理的位置。
private class CmdLineImpl implements Parameters {
private final String[] args;
private int pos;
....
}
A、通过”-“判断一个命令选项。取出选项名a,迭代CmdLineParser里的容纳OptionHandler的list。
B、根据OptionHandler里的OptionDef找出匹配的对象。
C、根据对应的OptionHandler里的Setter,继续处理CmdLineImpl,把后续的值反射进Bean.
D、如果没有参数解析玩,重复A。
执行命令
通过解析定义,解析参数后,就正确完成了bean的初始话。
根据约定,会调用bean的run方法开始执行程序。