从零开始写JVM(2):编写命令行工具

本章目的:为整个项目提供一个入口,实现一个类似于cmd的入口

代码实现效果:通过cmd “XXX”  展现不同输出

                        --version 显示  "version 1.0.1"(hard code的)

                        --help  显示  "show help message"(hard code的)

                        --cp   foo/bar MyApp arg1 arg2  显示"classpath:foo/bar class:Myapp args:[arg1 arg2]"

之后还会加对应的指令,现在暂时就这几个。。。。以为代码和博客同步进行,所以之后再enhance~

与jvm影响不大的,就直接hard code了,请轻喷~

由于git 账号有点问题,就直接粘贴代码了,

git地址之后之后补上~

 

首先创建一个Cmd Bean,

public class Cmd {
	private String order;
	
	public Cmd(String order) {
		this.order  = order;
	}

	public String getOrder() {
		return order;
	}
	public void setOrder(String order) {
		this.order = order;
	}
		
	
	
}

由于考虑到 处理order指令的工作不应该由Cmd来做,所以新建了一个类叫ParseCmd,作用就是根据不同的指令,进行不同的操作,上代码~

public class ParseCmd {
	private Cmd cmd;
	
	public ParseCmd(Cmd cmd) {
		this.cmd = cmd;
	}
	
	public void parse() {
		Option option = null;
		String order = cmd.getOrder();
		//得到指令,如--version --help ,然后根据指令进行不同操作
		String optionorder = getOption(cmd);
		if("--version".equals(optionorder)) {
			option = new VersionOption();
		}else if("--help".equals(optionorder)) {
			option = new HelpOption();
		}else if("--cp".equals(optionorder)) {
			option = new ClassPathOption(order);
		}
		option.doProcess();
		
	}

	private String getOption(Cmd cmd) {
		String order = cmd.getOrder();
		String[] orders = order.split("\\s+");
		return orders[0];
	}
}

由于自定义规则,根据输入的第一个指令来区分行为,所以通过getOption来得到对应的指令,然后通过多态来实现option接口,最后根据不同指令来实现接口的doprocess方法。

option接口中就一个doprocess方法,就不上代码了,把具体实现类上一下。。。。hardcode。。。println。。。轻喷~

VersionOption:

public class VersionOption implements Option{

	@Override
	public void doProcess() {
		System.out.println("version 1.0.1");
	}

}

HelpOption:

public class HelpOption implements Option{

	@Override
	public void doProcess() {
		System.out.println("show help message");
	}

}

ClassPathOption:

public class ClassPathOption implements Option{
	private String order;
	
	public ClassPathOption(String order) {
		this.order = order;
	}
	@Override
	public void doProcess() {
		String[] orders = order.split("\\s+");
		String classPath = orders[1];
		String className = orders[2];
		StringBuffer classArgs = new StringBuffer();
		if(orders.length>3) {
			classArgs.append("[");
			int length = 3;
			while(length<orders.length) {
				classArgs.append(orders[length]);
				classArgs.append(" ");
				length++;
			}
			classArgs.append("]");
		}
		
		System.out.println("classpath:"+classPath+" class:"+className+" args:"+classArgs);
	}
	
}

最后,就是main函数(结果在注释里):

public class Main {
	public static void main(String[] args) {
		Cmd cmd = new Cmd("--version");
		/*结果是:version 1.0.1*/
		
//		Cmd cmd = new Cmd("--help");
		/*结果是:show help message*/
		
//		Cmd cmd = new Cmd("--cp foo/bar MyApp arg1 arg2 arg3");
		/*结果是:classpath:foo/bar class:MyApp args:[arg1 arg2 arg3 ]*/
		
		ParseCmd parseCmd = new ParseCmd(cmd);
		parseCmd.parse();
		
	}
}

虽然简单,但是一个简单的cmd还是出来了,感觉还是蛮优秀的,就是这么自恋,不接受反驳。。。。。。

 

明天开始class文件的读取~~~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值