知道Python语言的Google Fire项目么,我将它移植到了Java上

最近尝试了Python语言的开源命令行便捷工具库Google Fire,它是用来加速用户编写命令行程序的一个小工具库,该工具使用非常方便,节省了编写命令行程序繁琐的参数解析代码的时间。

但是我发现Java语言还缺少这样一个工具库,于是花了2天时间,将Google Fire移植到了Java语言上,命名为Startup。有了Startup,Java同学也可以从此不用解析繁琐的命令行参数了。

Startup项目的Github代码地址 https://github.com/pyloque/startup

安装依赖

让Jedis秒变命令行

使用maven将程序打包成jar包文件demo.jar,接下来就可以体验命令行版本的Jedis了。

我们还可以使用单行命令模式,将shell方法改成fire即可,有了fire函数,繁琐的命令行参数解析过程就可以彻底拜拜了。

接下来,我们尝试一下单行命令的效果

Redis的set命令在Jedis里存在多个重载函数,很难记清楚具体有哪些参数。不过没关系,Startup提供了类自省功能,可以列出指定匹配模式的函数调用形式。

自省操作符是!,它连带祖先类一会自省了。当set方法有如此多时,如何调用具体哪个set方法呢?Startup使用参数数量和参数类型来匹配函数,如果有多个函数满足匹配条件,就使用第一个函数。比如现在要调用byte[]类型的set函数,我们可以这样写

因为输出是一个byte[]数组,所以显示的是它的toString()调用的结果。如果用户不满意输出效果,可以通过自定义方法来优化输出。

细节规则

方法调用使用@前缀,如@set

字段访问使用$前缀,如$host

方法调用如果遇到同样参数数量的方法不止一个,那么在传递参数时就必须携带参数类型前缀信息,便于startup确定具体应该调用哪个方法。如,表示调用两个参数都是String类型的set方法。如果不给予参数类型提示,那么自动使用第一个找到的方法,这可能不是你想要的。

startup的target参数可以是普通对象,也可以是类。比如,那么后续的参数作用对象就是Jedis.class。

如果target是类,那么可以使用操作符+号对类进行实例化,后面跟着构造器的参数列表。比如Jedis有构造器,那么就可以这样实例化

如果target是类,并且有默认构造器的话,那么如果要访问实例方法或者实例字段的话,就会对这个类进行自动实例化。如果没有默认构造器,这时候就会抛出异常。

如果某个方法返回值为void,Startup会进行特殊处理,返回调用对象自身。

自省操作符!可以使用显示所有方法,可以使用显示所有字段,如果不带参数,等价于列出所有的字段和方法。像Jedis类里面实例方法特别多,如果全部列出来会让人崩溃,这时可以用第三个参数maxlen,表示最多显示多少行。比如最多显示100行方法。还可以通过模式匹配*号来查找方法,比如匹配所有包行set字符串的方法列表。

输入exit和q可以退出命令行shell。

实例演示

下面我们使用链式调用的例子来演示Startup的强大威力。首先我们编写一个Counter类,可以对该类里面的整形字段value进行incr和decr操作。然后使用Startup对它进行shell化。同时我们定一个coeff静态变量,用于放大自增自减的效果。

我们运行一下,体验一下Startup的神奇魅力。

自省

构造器

静态字段和方法

链式调用

总结

Java版本的Startup和Google Fire使用上还是有一些不一样,这个是语言的机制差别所致。但是使用上是大同小异,基本上Google Fire能做到的事,Startup都能做了,只是在使用形式上略有不同。

Startup继承了Fire的优良传统,小巧轻便没有任何依赖项,使用一行代码就把命令行的繁琐解析过程给彻底消灭了。同时还提供了Fire所欠缺的自省功能和交互式shell,用户使用Startup进行调试工作时会无比轻松。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180611G09QCF00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券