gojvm目录
1、搭建go环境
2、cmd命令行参数解析
3、搜索class文件
4、添加testOption 便于单元测试
5、解析classfile文件
6、运行时数据区
7、指令集
8、解释器
9、创建Class
10、类加载器
11、对象实例化new object
12、方法调用和返回
13 类初始化
14、jvm支持数组
15、jvm支持字符串-数组扩展
16、本地方法调用
17、ClassLoader原理
18、异常处理
19、 启动jvm
原因
自己手动写java虚拟机源码,属于章回式讲课。
实际项目,要减少冗余重复代码,让接手的人易于理解
也要有单元测试类,便于项目重构
因此添加testOption
测试参数
增加 -test
type Cmd struct {
testOption string // 指定测试方法
}
func parseCmd() *Cmd {
//增加测试方法
flag.StringVar(&cmd.testOption, "test", "", "test")
}
main函数调用
根据cmd.testOption内容判断调用测试方法
func main() {
cmd := parseCmd()
if cmd.versionFlag {
fmt.Println("version 0.0.1")
} else if cmd.helpFlag || cmd.class == "" {
printUsage()
} else if cmd.testOption == "cmd" {
parseCmdLine(cmd)
} else if cmd.testOption == "classpath" {
parseClasspath(cmd)
} else {
startJvm(cmd)
}
}
测试shell脚本
#!/bin/sh
set -ex
cd ./go
export GOPATH=$PWD
#main 编译目录
go run main -version
//测试 命令行功能
go run main -test "cmd" 12 344 567
//测试类查找功能
go run main -test "classpath" java.lang.Object
网友评论