自己手写Java虚拟机(第1章 命令行工具)

xiaoxiao2025-10-15  8

学习Java虚拟机以及go语法,记录下自己的学习过程

第1章 命令行工具

1.1 准备工作 1.1.1 安装JDK1.1.2 安装Go1.1.3 创建目录结构 1.2 java命令1.3 编写命令行工具1.4 测试本章代码1.5 本章小结

1.1 准备工作

这里就不作说明了,看书就可以轻松完成。

1.2 java命令

问题:如何启动Java应用程序? 首先启动Java虚拟机,然后加载主类,最后调用主类的main()方法。

问题:Java虚拟机从哪个类启动应用程序? Java虚拟机规范没有明确规定。也就是说,是由虚拟机实现自行决定的。比如Oracle的Java虚拟机实现是通过java命令来启动的,主类名由命令行参数指定。Java命令有如下4种形式:

java [-options] class [args] java [-options] -jar jarfile [args] javaw [-options] class [args] javaw [-options] -jar jarfile [args]

注:java是标准选项,javaw是非标准选项。

1.3 编写命令行工具

先上代码,新建了一个cmd.go文件,如下:

package main import "flag" import "fmt" import "os" type Cmd struct { helpFlag bool versionFlag bool cpOption string class string args []string } func parseCmd() *Cmd { cmd := &Cmd{} flag.Usage = printUsage flag.BoolVar(&cmd.helpFlag, "help", false, "print help message") flag.BoolVar(&cmd.helpFlag, "?", false ,"print help message") flag.Parse() args := flag.Args() if len(args) > 0 { cmd.class = args[0] cmd.args = args[1:] } return cmd } func printUsage() { fmt.Printf("Usage: %s [-option] class [args...]\n", os.Args[0]) }

初看go语言代码有点懵逼,查了一下go语言api才慢慢看懂,来一行一行理解:

package就是包,不多说了,有java基础就看懂了import导入包struct表示定义结构体,类似java的成员变量,本人是这么理解的func parseCmd() *Cmd新建方法名为parseCmd,指针指向Cmd结构体cmd := &Cmd{}类似java的newflag.Usage = printUsage给Usage赋值,flag是内部包,自带Usageflag.BoolVar(&cmd.helpFlag, “help”, false, “print help message”)这行有点内容了 flag 是Go 标准库提供的解析命令行参数的包。 使用方式: flag.Type(name, defValue, usage) 其中Type为String, Int, Bool等;并返回一个相应类型的指针。 flag.TypeVar(&flagvar, name, defValue, usage) 将flag绑定到一个变量上flag.Parse()表示调用Parse()函数解析选项args := flag.Args()表示调用flag.Args函数可以捕获其他没有被解析的参数,后续看main方法例子return cmd表示返回值

Go 学习笔记:Println 与 Printf 的区别

Println :可以打印出字符串,和变量 Printf : 只可以打印出格式化的字符串,可以输出字符串类型的变量,不可以输出整型变量和整型

a := 10 fmt.Println(a)   //right fmt.Println("abc")  //right fmt.Printf("%d",a)  //right fmt.Printf(a)   //error

1.4 测试本章代码

在ch01目录下创建main.go文件,然后输入代码:

package main import "fmt" func main() { cmd := parseCmd() if (cmd.helpFlag || cmd.class == "") { printUsage() } else { println("helpFlag==",cmd.helpFlag) } }

注:只为了测试一个-help功能

测试一

C:\Go\bin>go install jvmgo\ch01 # jvmgo/ch01 D:\go\workspace\src\jvmgo\ch01\main.go:3: imported and not used: "fmt"

说明:go语言没使用的import包的内容会编辑报错

测试二

package main func main() { cmd := parseCmd() if (cmd.helpFlag || cmd.class == "") { printUsage() } else { println("helpFlag==",cmd.helpFlag) } }

编译通过

C:\Go\bin>go install jvmgo\ch01 C:\Go\bin>

输入help选项,返回了false,未执行printUsage()方法

C:\Go\bin>ch01.exe help helpFlag== false C:\Go\bin>

测试三

输入-help选项,返回正确的信息

C:\Go\bin>ch01.exe -help Usage: ch01.exe [-option] class [args...]

注:测试二和测试三区别在于一个“-”符号,go语言flag包意义就是命令行参数解析

flag – 命令行参数解析 没有输入“-”符号的参数,flag.Args()函数捕获没有被解析的参数。

1.5 本章小结

搭建好开发环境,学习java命令用法,使用go语言编写一个简化版的命令行工具。

转载请注明原文地址: https://www.6miu.com/read-5037956.html

最新回复(0)