爲了更好的學習jvm閱讀過《Java虛擬機規範》、《本身動手寫Java虛擬機》,尤爲是《自動動手寫java虛擬機》能夠更加清晰的看到全貌。對於程序開發者來講學習一個新東西最好事必躬親,親力親爲的作出一些demo,只有輸出告終果內心才踏實。java
本章節主要是經過編寫java代碼,從main方法入口進行獲取指令。例如;-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.xmljvm
<!-- 命令行參數解析器 -->
<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"
複製代碼
微信搜索「bugstack蟲洞棧」公衆號,關注後回覆「用Java實現jvm源碼」獲取本文源碼&更多原創專題案例! ui