2007年4月5日星期四

利用反射编写简单的Java Shell

反射和annotation是以前我很少用的功能。最近发现,利用他们可以做很漂亮的shell,在原型开发的命令行控制中,还是很有用的:)

例如最经典的一个命令:用help输出所有支持的命令
    @Description("查看命令清单")
    public void help(){
        //echo("命令与参数用一个空格分开,参数字符串中不得含有空格");
        Method[] ms=Shell.class.getDeclaredMethods();
        for(Method m : ms){
            Class[] cs=m.getParameterTypes();
            if(cs.length==0)
                echo(m.getName());
            else
                echo(m.getName()+" [par]");
            System.out.println("\t"+m.getAnnotation(Description.class).value());
        }
    }
其中Description是定义的一个annotation,从此我们发现,注释作为文档的一部分不仅仅是文本,而且是"有结构的"、"可编程的",还是javadoc文档的一部分。shell只用到其中很小的一点作用,这样声明

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@interface Description { 
    String value(); 
}


然后利用命令行输入的字符串,就可以执行相同方法名的方法了

String cmd = ReadLine();
Method m = Shell.class.getMethod(cmd, new Class[0]);
m.invoke(sh, new Object[0]);

大的框架是这样了,api细节参考jdk doc或google

没有评论: