《自己动手写java虚拟机》学习笔记(二)-----命令行工具(java)

项目地址:https://github.com/gongxianshengjiadexiaohuihui

首先是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

猜你喜欢

转载自blog.csdn.net/qq_33543634/article/details/82979264