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

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

第1章 命令行工具

  • 1.1 准备工作
    • 1.1.1 安装JDK
    • 1.1.2 安装Go
    • 1.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才慢慢看懂,来一行一行理解:

  1. package就是包,不多说了,有java基础就看懂了
  2. import导入包
  3. struct表示定义结构体,类似java的成员变量,本人是这么理解的
  4. func parseCmd() *Cmd新建方法名为parseCmd,指针指向Cmd结构体
  5. cmd := &Cmd{}类似java的new
  6. flag.Usage = printUsage给Usage赋值,flag是内部包,自带Usage
  7. flag.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绑定到一个变量上
  8. flag.Parse()表示调用Parse()函数解析选项
  9. args := flag.Args()表示调用flag.Args函数可以捕获其他没有被解析的参数,后续看main方法例子
  10. 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语言编写一个简化版的命令行工具。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值