0
点赞
收藏
分享

微信扫一扫

用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、调试配置
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第一章《命令行工具》_java


举报

相关推荐

Java第一章

JVM 命令行工具

JAVA——第一章1.8

第一章--JVM面试题

第一章 java绪论

JAVA 第一章总结

0 条评论