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

小傅哥 | 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"

你可能感兴趣的:(java写jvm)