小傅哥 | 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
五, 代码示例
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;
- /**
- * https://bugstack.cn/
- * 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;
- /**
- * https://bugstack.cn
- * 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"
来源: https://www.qcloud.com/developer/article/1575622