【Go语言实现JVM】根据Java命令编写命令行工具

17 篇文章 0 订阅
1 篇文章 0 订阅

一、Java应用程序运行命令

Java应用程序需要有一个入口,而这个入口就是main()方法,包含main()方法的这个Java类叫作主类。JVM规范并没有规定哪个类是主类,所以我们可以自己创建一个主类,只要包含main()方法即可。

虽然我们可以自定义一个主类,但是如何告诉JVM哪个类是主类呢?实际上JVM是通过java命令来加载并启动主类,主类名可以由命令行参数指定

我们在cmd命令窗口执行java命令
在这里插入图片描述
从回显中可以看到java命令的具体用法

  • java [-options] class [args...] (执行类)

  • java [-options] -jar jarfile [args...] (执行 jar 文件)

以执行类为例,用法表明可以向这个java命令传递三个参数:

  • [-options] :选项
  • class:主类名(告诉JVM哪个类是主类)
  • [args...]main()方法参数(可传递多个参数)

其中选项可以分为标准选项和非标准选项,非标准选项以-X开头
在这里插入图片描述

二、Go语言编写命令行工具

java命令可以加载并启动主类,我们首先需要根据java命令的第一种执行类的用法,实现一个命令行工具用来解析执行java命令

首先需要定义一个结构体用来表示命令行选项参数

/*命令行选项和参数的结构体定义*/
type Cmd struct {
	helpFlag    bool     //帮助选项,输出帮助信息
	versionFlag bool     //版本选项,输出版本信息
	cpOption    string   //目录和 zip/jar 文件的类搜索路径,用于搜索类文件
	class       string   //主类名,用于指定主类
	args        []string //参数信息
}

一个命令行结构体,我们就可以描述一个java命令,同时还需要能够解析这个java命令。所以要定义一个解析命令行的函数

/*Go语言内置了`flag`包可以用来处理命令行选项,`os`包中定义了`Args`变量,其中存放传递给命令行的全部参数*/
func parseCmd() *Cmd {
	cmd := &Cmd{}
	//编写printUsage()函数,用来输出到控制台
	flag.Usage = printUsage
	//Var函数用来设置需要解析的选项
	flag.BoolVar(&cmd.helpFlag, "help", false, "print help message")
	flag.BoolVar(&cmd.helpFlag, "?", false, "print help message")
	flag.BoolVar(&cmd.versionFlag, "version", false, "print version and exit")
	flag.StringVar(&cmd.cpOption, "classpath", "", "classpath")
	flag.StringVar(&cmd.cpOption, "cp", "", "classpath")
	//调用Parse函数解析选项
	flag.Parse()
	args := flag.Args()
	if len(args) > 0 {
		cmd.class = args[0] //第一个参数是主类名
		cmd.args = args[1:] //从第二个参数开始往后,都是main()方法的参数
	}
	return cmd
}

func printUsage() {
	fmt.Printf("Usage: %s [-options] class [args...]\n", os.Args[0])
}

Go程序的入口也是main()函数,所以需要创建一个go文件,里面包含main()函数,然后调用parseCmd()函数解析命令行参数,如果解析成功就调用startJVM()函数

func main() {
	cmd := parseCmd()
	if cmd.versionFlag {
		fmt.Println("version 1.0")
	} else if cmd.helpFlag || cmd.class == "" {
		printUsage()
	} else {
		startJVM(cmd)
	}
}

func startJVM(cmd *Cmd) {
	fmt.Printf("classpath: %s class:%s args:%v\n", cmd.cpOption, cmd.class, cmd.args)
}

执行编译出来的exe文件并测试
在这里插入图片描述
至此就实现了一个简单的用来解析java命令的命令行工具

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值