自己手写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语言编写一个简化版的命令行工具。

很好!手写 Java 规则引擎可以让你更好地理解规则引擎原理和内部实现。 以下是手写 Java 规则引擎的简单步骤: 1. 定义规则接口:首先,你需要定义规则接口,以便实现不同类型的规则。 ```java public interface Rule { boolean evaluate(Facts facts); } ``` 2. 实现规则接口:然后,你需要实现规则接口并实现 `evaluate` 方法。该方法的参数是一个 Facts 对象,其中包含了规则需要评估的条件。 ```java public class AgeRule implements Rule { private final int ageLimit; public AgeRule(int ageLimit) { this.ageLimit = ageLimit; } @Override public boolean evaluate(Facts facts) { int age = facts.getFact("age"); return age >= ageLimit; } } ``` 3. 定义事实对象:接下来,你需要定义一个包含需要评估的条件的事实对象。可以使用 Map 来存储事实。 ```java public class Facts { private final Map<String, Object> facts = new HashMap<>(); public void addFact(String name, Object value) { facts.put(name, value); } public Object getFact(String name) { return facts.get(name); } } ``` 4. 定义规则引擎:最后,你需要定义一个规则引擎来处理规则。规则引擎会遍历规则列表并对每个规则进行评估。 ```java public class RuleEngine { private final List<Rule> rules = new ArrayList<>(); public void addRule(Rule rule) { rules.add(rule); } public boolean run(Facts facts) { for (Rule rule : rules) { if (!rule.evaluate(facts)) { return false; } } return true; } } ``` 现在你可以使用以上代码创建一个规则引擎并添加规则。例如: ```java RuleEngine engine = new RuleEngine(); engine.addRule(new AgeRule(18)); Facts facts = new Facts(); facts.addFact("age", 20); boolean result = engine.run(facts); ``` 以上代码将创建一个规则引擎,其中包含一个 AgeRule 规则,该规则要求被评估的年龄必须大于或等于 18 岁。然后它创建一个包含年龄为 20 的事实对象,并将该对象传递给规则引擎以进行评估。评估结果将存储在 `result` 变量中。 这只是手写 Java 规则引擎的基础。你可以通过添加更多的规则类型和操作符来扩展它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值