《自己动手写java虚拟机》学习笔记(二)-----命令行工具(java)
首先是Cmd的类
/**
* @ClassName Cmd
* @Description TODO
* @Author Mr.G
* @Date 2018/10/9 9:40
* @Version 1.0
*/
public class Cmd {
boolean isRightFmt=true;//是否是正确的格式
boolean helpFlag;//是否需要查看帮助
boolean versionFlag;//是否查看版本
String XjreOption;//启动类路径
String cpOption="";//classpath的路径
String clazz;//需要编译的类名
String[] args;//执行class文件的参数
public Cmd(String[] args){
parseCmd(args);
}
private void parseCmd(String[] args){
//防止下方数组越界
if(args.length<2){
isRightFmt=false;
return;
}
if(!args[0].equals("java")){
isRightFmt=false;
return;
}else if(args[1].equals("-help")||args[1].equals("-?")){
helpFlag=true;
return;
}else if(args[1].equals("-version")){
versionFlag=true;
return;
}else if(args[1].equals("-cp")||args[1].equals("-classpath")){
this.cpOption=args[2];
}else if(args[1].equals("-Xjre")){
this.XjreOption=args[2];
}else{
isRightFmt=false;
return;
}
if(args.length<4){
//走到这一步,命令一定是-cp或者-Xjre,所以长度一定大于等于4
isRightFmt=false;
return;
}else{
this.clazz=args[3];
//把参数放到this.args里面
this.args=new String[args.length-4];
for(int i=4;i<args.length;i++){
this.args[i-4]=args[i];
}
}
}
public void printUsage(){
System.out.println("Usage: java [-options] class [args...]");
}
}
然后是Main函数
/**
* @ClassName Main
* @Description TODO
* @Author Mr.G
* @Date 2018/10/9 10:43
* @Version 1.0
*/
public class Main {
public static void main(String[] args){
Cmd cmd=new Cmd(args);
if(!cmd.isRightFmt||cmd.helpFlag){
cmd.printUsage();
}else if(cmd.versionFlag){
System.out.println("version 0.0.1");
}else{
startJVM(cmd);
}
}
public static void startJVM(Cmd cmd){
System.out.println("test");
}
}
接着开始测试
我的编译环境是IDEA
向main函数里传入参数需要在Edit Configurations里设置
参数之间用空格隔开
结果
参考资料:https://zachaxy.github.io