本文是學習《自己動手寫 Java 虛擬機》的第一篇學習筆記,將通過對該書的學習,一步一步使用 Java 語言編寫 Java 虛擬機(作者使用的是 Go 語言),應該是很窮人版 Java 虛擬機,就是解析 Java 代碼,然後編寫執行引擎去執行這段代碼。
跟隨作者的腳步,首先基於 Java 實現一個命令行工具。
JCommander
這裏使用 JCommander 實現一個命令行工具(Commons CLI 也可以)。
JCommander is a very small Java framework that makes it trivial to parse command line parameters.
官方文檔地址:http://jcommander.org/
大致瞭解後,先不過多關注細節,寫一個 Demo 試試。
引入相關依賴:
<dependency>
<groupId>com.beust</groupId>
<artifactId>jcommander</artifactId>
<version>1.78</version>
</dependency>
官網的 Demo:
package com.dongguabai.jvm.terminal;
import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;
/**
* @author Dongguabai
* @Description
* @Date 創建於 2020-06-08 05:34
*/
public class JcommanderTest {
@Parameter(names={"--length", "-l"})
int length;
@Parameter(names={"--pattern", "-p"})
int pattern;
public static void main(String ... argv) {
JcommanderTest main = new JcommanderTest();
JCommander.newBuilder()
.addObject(main)
.build()
.parse(argv);
main.run();
}
public void run() {
System.out.printf("%d %d", length, pattern);
}
}
隨後加上啓動參數(這裏要注意的是沒必要比較糾結在 javac
上):
輸出:
512 2
可以發現,使用還是非常簡單的。
編寫命令行工具
JCommander 使用還是非常方便的,暫時先寫幾個比較簡單的,以後根據需要加入:
package com.dongguabai.jvm.terminal;
import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;
/**
* @author Dongguabai
* @Description
* @Date 創建於 2020-06-08 07:36
*/
public class DongguabaiJVMCommander {
private static final String CURRENT_VERSION = "Dongguabai jdk version \"0.0.1\"";
/**
* 查看版本
*/
@Parameter(names = {"--version", "-v"}, required = false, arity = 0, description = "print product version and exit")
private boolean version;
/**
* help
*/
@Parameter(names = {"--help", "-h"}, required = false, arity = 0,description = " print the help message")
private boolean help;
/**
* 運行 Java 代碼
*/
@Parameter(names = {"--run"}, required = false, arity = 1,description = "to execute a java file")
private String run;
public static void main(String... argv) {
DongguabaiJVMCommander main = new DongguabaiJVMCommander();
JCommander jCommander = JCommander.newBuilder()
.addObject(main)
.build();
jCommander.parse(argv);
main.run(jCommander);
}
private void run(JCommander jCommander) {
if (version) {
System.out.println(CURRENT_VERSION);
return;
}
if (help) {
jCommander.usage();
return;
}
if (run != null){
System.out.printf("execute:%s",run);
}
}
}
測試一下:
啓動參數爲 -v
,輸出:
Dongguabai jdk version "0.0.1"
啓動參數爲 -h
,輸出:
Usage: <main class> [options]
Options:
--help, -h
print the help message
Default: false
--run
to execute a java file
--version, -v
print product version and exit
Default: false
啓動參數爲 --run hello.java
,輸出:
execute:hello.java
References
- 《自己動手寫 Java 虛擬機》
- http://jcommander.org/
歡迎關注公衆號