本文是学习《自己动手写 Java 虚拟机》的第一篇学习笔记,将通过对该书的学习,一步一步使用 Java 语言编写 Java 虚拟机(作者使用的是 Go 语言),应该是很穷人版 Java 虚拟机,就是解析 Java 代码,然后编写执行引擎去执行这段代码。
跟随作者的脚步,首先基于 Java 实现一个命令行工具。
这里使用 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.beustgroupId>
<artifactId>jcommanderartifactId>
<version>1.78version>
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
欢迎关注公众号