java通过main方法传参

阅读: 评论:0

java通过main方法传参

java通过main方法传参

项目中有一些用java写成的可执行的工具,需要调用者传入大量的参数。最开始,我使用的是最传统的方式,直接一个传入参数数组,于是有如下这么壮观的代码:

public static void main(String[] args) {

String aaa = args[0];

String bbb = args[1];

String ccc = args[2];

String ddd = args[3];

String eee = args[4];

String fff = args[5];

String ggg = args[6];

String hhh = args[7];

// do something with these arguments

}

调用者:

java MyTool hello world1 world2 world3 world4 world5 world6 world7

客户同事拿去用后,感觉十分不便,向我抱怨。原来他在写脚本调用的时候,必须反复查看我的java源代码,才知道每个参数是做什么的。写完之后,下次需要修改的时候,又忘了还得来查。而且参数顺序还不能错,个数也不能多不能少,总之就是很麻烦。

我也认识到这个问题确实存在,便问客户同事有没有什么好办法,他给了我这样的例子:

public static void main(String[] args) {

String aaa = Property("aaa");

String bbb = Property("bbb");

String ccc = Property("ccc");

String ddd = Property("ddd");

String eee = Property("eee");

String fff = Property("fff");

String ggg = Property("ggg");

String hhh = Property("hhh");

// do something with these arguments

}

调用者:

java -Daaa=hello -Dbbb=world1 -Dccc=world2 -Dddd=world3 -Deee=world4 -Dfff=world5 -Dggg=world6 -Dhhh=world7 MyTool

客户同事的意思是,这种做法可以“完美”的解决他提到的那几个不便之处,比如:

-D后面的参数名可用于提醒参数的意思

顺序怎么写都行

如果哪个参数是可选的,可以直接删除即可

虽然我第一感觉是“竟然敢用这种方式来传参数!”,但一时之间竟想不出什么话来反对,因为他这种方式能做到的,我那种方式的确做不到。

细想一下,这两种方式倒是相当互补,我有你无,我无你有。虽然相比起来,我觉得后者问题更多,因为它会污染System属性环境,更容易产生一些不可预料的问题,但也不失为一种有思考价值的方案。

然后,我想到了这样一种试图结合两者优点的方案:

public static void main(String[] args) {

Map map = new HashMap();

for(int i=0; i

map.put(args[i], args[i+1]);

}

String aaa = ("-aaa");

String bbb = ("-bbb");

String ccc = ("-ccc");

String ddd = ("-ddd");

String eee = ("-eee");

String fff = ("-fff");

String ggg = ("-ggg");

String hhh = ("-hhh");

// do something with these arguments

}

调用者:

java MyTool -aaa hello -bbb world1 -ccc world2 -ddd world3 -eee world4 -fff world5 -ggg world6 -hhh world7

看起来似乎清楚了一些,虽然更长了一点。现在,它也可以:

参数列表中有用作提示参数

顺序怎么写都行

如果有可选参数,直接删除对应项

而且不污染System属性环境,相比前面的-D方案,要稍好一些。

只能做到这个程度了吗?看上面的三种方案,实际上都存在着一些问题,需要写更多代码:

打印usage

对参数进行检查,如果有缺少的或不合理的,要提示错误

这些缺失的工作实际上相当烦琐,让我们的代码更加混乱,却又不可或缺。

有没有优雅一些的方式呢?答案是有,我们可以利用java的annotation去描述我们的参数,使用这些信息对参数进行验证、取值以及打印使用帮助。

市面上有不少这样的库,比如args4j, jcommands等,我最后选用了args4j。

首先我们需要写一个类,里面用annotation来描述我们的程序需要什么样的参数:

public class Args {

@Option(required=true, name="-aaa",usage="aaa is something")

private String aaa;

@Option(name="-bbb",usage="bbb is something")

private String bbb;

@Option(name="-ccc",usage="ccc is something")

private String ccc;

@Option(name="-ddd",usage="ddd is something")

private String ddd;

@Option(name="-eee",usage="eee is something")

private String eee;

@Option(name="-fff",usage="fff is something")

private String fff;

@Option(name="-ggg",usage="ggg is something")

private String ggg;

// getters for them

}

这样可以很清楚的方式知道每个参数的作用、描述等。

然后取值:

public static void main(String[] args) {

Args myArgs = new Args();

CmdLineParser parser = new CmdLineParser(myArgs);

parser.parseArgument(myArgs);

}

这时,myArgs实例中的各fields,就已经自动赋予了相应的值,是由CmdLineParser通过反射赋值的。

想打印使用提示呢?

parser.printUsage(System.out);

它会根据Args里的定义,自动组织成一种可读性较好的格式,输出使用提示,十分贴心。

调用者:

java MyTool -aaa hello -bbb world1 -ccc world2 -ddd world3 -eee world4 -fff world5 -ggg world6 -hhh world7

虽然看起来调用方式跟之前没什么变化,但内涵却更加丰富了,而我们要做的,仅仅是定义一个描述类,和调用三两行代码而已。

这是我目前认为最优雅的解决方案。

clob字段的值插入和查询N种方法【包括java调用存储过程传入clob参数】

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import jav ...

java程序main方法的参数String[] args

public class ArgsTest { public static void main(String[] args) { System.out.println(args.length); fo ...

133、Java获取main主函数参数

01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

java中方法传入参数时:值传递还是址传递?

JAVA中的数据类型有两大类型: ① 基本数据类型:逻辑型(boolean).文本型(char).整数型(byte.short.int.long).浮点型(float.double) ② 引用数据类型 ...

java项目打包成可运行的jar,main方法带参数

本文发布于:2024-01-28 07:44:15,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17063990615873.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:方法   java   main
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23