自己动手写Java虚拟机
上QQ阅读APP看书,第一时间看更新

2.3.2 DirEntry

在4种实现中,DirEntry相对简单一些,表示目录形式的类路径。在ch02\classpath目录下创建entry_dir.go文件,在其中定义DirEntry结构体,代码如下:

package classpath

import "io/ioutil"
import "path/filepath"

type DirEntry struct {
absDir string
}

func newDirEntry(path string) *DirEntry {...}
func (self *DirEntry) readClass(className string) ([]byte , Entry, error) {...}
func (self *DirEntry) String() string {...}

DirEntry只有一个字段,用于存放目录的绝对路径。和Java语言不同,Go结构体不需要显示实现接口,只要方法匹配即可。Go没有专门的构造函数,本书统一使用new开头的函数来创建结构体实例,并把这类函数称为构造函数。newDirEntry()函数的代码如下:

func newDirEntry(path string) *DirEntry {
absDir, err := filepath.Abs(path)
if err ! = nil {
  panic(err)
}
return &DirEntry{absDir}
}

newDirEntry()先把参数转换成绝对路径,如果转换过程出现错误,则调用panic()函数终止程序执行,否则创建DirEntry实例并返回。

下面介绍readClass()方法:

func (self *DirEntry) readClass(className string) ([]byte, Entry, error) {
fileName := filepath.Join(self.absDir, className)
data, err := ioutil.ReadFile(fileName)
return data, self, err
}

readClass()先把目录和class文件名拼成一个完整的路径,然后调用ioutil包提供的ReadFile()函数读取class文件内容,最后返回。String()方法很简单,直接返回目录,代码如下:

func (self *DirEntry) String() string {
return self.absDir
}