【读码练习/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方法开始执行程序。

posted @ 2011-09-04 19:40  倚楼无语F5  阅读(588)  评论(0编辑  收藏  举报