小傅哥 | https://bugstack.cn
沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。目前已完成的专题有;Netty4.x实战专题案例、用Java实现JVM、基于JavaAgent的全链路监控、手写RPC框架、架构设计专题案例、源码分析等。
你用剑 、我用刀 ,好的代码都很烧,望你不吝出招!
一、背景描述
为了更好的学习jvm阅读过《Java虚拟机规范》、《自己动手写Java虚拟机》,尤其是《自动动手写java虚拟机》可以更加清晰的看到全貌。对于程序开发者来说学习一个新东西最好事必躬亲,亲力亲为的做出一些demo,只有输出了结果心里才踏实。
二、案例简述
本章节主要是通过编写java代码,从main方法入口进行获取指令。例如;-version
三、环境准备jdk 1.8.0
IntelliJ IDEA Community Edition 2018.3.1 x64
四、配置信息调试配置配置位置:Run/Debug Configurations -> program arguments
配置内容:-version
五、代码示例
1itstack-demo-jvm-01
2├── pom.xml
3└── src
4 └── main
5 │ └── java
6 │ └── org.itstack.demo.jvm
7 │ ├── Cmd.java
8 │ └── Main.java
9 └── test
10 └── java
11 └── org.itstack.demo.test
12 └── HelloWorld.javapom.xml
1
2
3 com.beust
4 jcommander
5 1.72
6Cmd.java
1package org.itstack.demo.jvm;
2
3import com.beust.jcommander.JCommander;
4import com.beust.jcommander.Parameter;
5
6import java.util.List;
7
8/**
9 * https://bugstack.cn/
10 * create by fuzhengwei on 2019/4/24
11 */
12public class Cmd {
13
14 @Parameter(names = {"-?", "-help"}, description = "print help message", order = 3, help = true)
15 boolean helpFlag = false;
16
17 @Parameter(names = "-version", description = "print version and exit", order = 2)
18 boolean versionFlag = false;
19
20 @Parameter(names = {"-cp", "-classpath"}, description = "classpath", order = 1)
21 String classpath;
22
23 @Parameter(description = "main class and args")
24 List mainClassAndArgs;
25
26 boolean ok;
27
28 String getMainClass() {
29 return mainClassAndArgs != null && !mainClassAndArgs.isEmpty()
30 ? mainClassAndArgs.get(0)
31 : null;
32 }
33
34 List getAppArgs() {
35 return mainClassAndArgs != null && mainClassAndArgs.size() > 1
36 ? mainClassAndArgs.subList(1, mainClassAndArgs.size())
37 : null;
38 }
39
40 static Cmd parse(String[] argv) {
41 Cmd args = new Cmd();
42 JCommander cmd = JCommander.newBuilder().addObject(args).build();
43 cmd.parse(argv);
44 args.ok = true;
45 return args;
46 }
47
48}Main.java
1package org.itstack.demo.jvm;
2
3/**
4 * https://bugstack.cn
5 * create by fuzhengwei on 2019/4/24
6 * program arguments:-version
7 */
8public class Main {
9
10 public static void main(String[] args) {
11 Cmd cmd = Cmd.parse(args);
12 if (!cmd.ok || cmd.helpFlag) {
13 System.out.println("Usage: [-options] class [args...]");
14 return;
15 }
16 if (cmd.versionFlag) {
17 System.out.println("java version \"1.8.0\"");
18 return;
19 }
20 startJVM(cmd);
21 }
22
23 private static void startJVM(Cmd cmd) {
24 System.out.printf("classpath:%s class:%s args:%s\n", cmd.classpath, cmd.getMainClass(), cmd.getAppArgs());
25 }
26
27}
六、测试结果
1java version "1.8.0"