自己動手寫 Java 虛擬機(一)-編寫命令行工具

本文是學習《自己動手寫 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/

歡迎關注公衆號
​​​​​​在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章