美文网首页码农的世界JavaJava 杂谈
用Java实现JVM第一章《命令行工具》

用Java实现JVM第一章《命令行工具》

作者: 702ea074a7fa | 来源:发表于2019-08-16 11:50 被阅读2次
    1_副本.jpg

    背景描述
    为了更好的学习jvm阅读过《Java虚拟机规范》、《自己动手写Java虚拟机》,尤其是《自动动手写java虚拟机》可以更加清晰的看到全貌。对于程序开发者来说学习一个新东西最好事必躬亲,亲力亲为的做出一些demo,只有输出了结果心里才踏实。

    案例简述
    本章节主要是通过编写java代码,从main方法入口进行获取指令。例如;-version

    环境准备
    1、jdk 1.8.0
    2、IntelliJ IDEA Community Edition 2018.3.1 x64

    配置信息
    1、调试配置
    2.1、配置位置:Run/Debug Configurations -> program arguments
    2.2、配置内容:-version

    代码示例

    itstack-demo-jvm-01
    ├── pom.xml
    └── src
        └── main
        │    └── java
        │        └── org.itstack.demo.jvm
        │             ├── Cmd.java
        │             └── Main.java
        └── test
             └── java
                 └── org.itstack.demo.test
                     └── HelloWorld.java
    

    pom.xml

    <!-- 命令行参数解析器 -->
    <dependency>
      <groupId>com.beust</groupId>
      <artifactId>jcommander</artifactId>
      <version>1.72</version>
    </dependency>
    

    Cmd.java

    package org.itstack.demo.jvm;
    
    import com.beust.jcommander.JCommander;
    import com.beust.jcommander.Parameter;
    
    import java.util.List;
    
    /**
     * http://www.itstack.org
     * create by fuzhengwei on 2019/4/24
     */
    public class Cmd {
    
        @Parameter(names = {"-?", "-help"}, description = "print help message", order = 3, help = true)
        boolean helpFlag = false;
    
        @Parameter(names = "-version", description = "print version and exit", order = 2)
        boolean versionFlag = false;
    
        @Parameter(names = {"-cp", "-classpath"}, description = "classpath", order = 1)
        String classpath;
    
        @Parameter(description = "main class and args")
        List<String> mainClassAndArgs;
    
        boolean ok;
    
        String getMainClass() {
            return mainClassAndArgs != null && !mainClassAndArgs.isEmpty()
                    ? mainClassAndArgs.get(0)
                    : null;
        }
    
        List<String> getAppArgs() {
            return mainClassAndArgs != null && mainClassAndArgs.size() > 1
                    ? mainClassAndArgs.subList(1, mainClassAndArgs.size())
                    : null;
        }
    
        static Cmd parse(String[] argv) {
            Cmd args = new Cmd();
            JCommander cmd = JCommander.newBuilder().addObject(args).build();
            cmd.parse(argv);
            args.ok = true;
            return args;
        }
        
    }
    

    Main.java

    package org.itstack.demo.jvm;
    
    /**
     * http://www.itstack.org
     * create by fuzhengwei on 2019/4/24
     * program arguments:-version
     */
    public class Main {
    
        public static void main(String[] args) {
            Cmd cmd = Cmd.parse(args);
            if (!cmd.ok || cmd.helpFlag) {
                System.out.println("Usage: <main class> [-options] class [args...]");
                return;
            }
            if (cmd.versionFlag) {
                System.out.println("java version \"1.8.0\"");
                return;
            }
            startJVM(cmd);
        }
    
        private static void startJVM(Cmd cmd) {
            System.out.printf("classpath:%s class:%s args:%s\n", cmd.classpath, cmd.getMainClass(), cmd.getAppArgs());
        }
    
    }
    

    测试结果

    java version "1.8.0"
    

    相关文章

      网友评论

        本文标题:用Java实现JVM第一章《命令行工具》

        本文链接:https://www.haomeiwen.com/subject/mtyfsctx.html