java中setvisible用不了_如何用Java实现JVM中的命令行工具?

背景描述

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

案例简述

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

环境准备

  1. jdk 1.8.0
  2. IntelliJ IDEA Community Edition 2018.3.1 x64

配置信息

  1. 调试配置配置位置:Run/Debug Configurations -> program arguments配置内容:-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

com.beust  jcommander  1.72

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 mainClassAndArgs;    boolean ok;    String getMainClass() {        return mainClassAndArgs != null && !mainClassAndArgs.isEmpty()                ? mainClassAndArgs.get(0)                : null;    }    List 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:  [-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", cmd.classpath, cmd.getMainClass(), cmd.getAppArgs());    }}

测试结果

java version "1.8.0"

今天的分享就到这了,我这里准备了一套java进阶方法笔记,学习资料面试题,电子书等免费笔记供大家学习.需要的小伙伴私信我回复"Java"即可领取免费资料.

c984112a96adf3a32da1e3df255fc405.png
8b0adaaf58b138e95bce27b6d66d36f8.png
54f97a9dc61ead5beeb7e56d29c35a2e.png

java核心知识点

fd38aaaff27e7f7edf96451155bf3759.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值