|
|
上面是一段最简单可运行Java代码了,要运行这么一段简单的代码,其实要做很多工作。加载HelloWorld类之前,首先要加载它的超类java.lang.Object,在调用main()函数之前,虚拟机要准备好参数数组,所以需要加载java.lang.String和java.lang.String[]类。把字符串打印到控制台还需要加载java.lang.System类,等等。。。这一章节就来学习下Java虚拟机是从哪里寻找这些类的。
类路径
类路径可以分为如下三个部分:
- 启动类路径(bootstrap classpath)
- 扩展类路径(extention classpath)
- 用户类路径(user classpath)
启动类路径默认对应jre/lib目录,Java标准库位于该路径。扩展类路径默认对应jre/lib/ext目录,使用Java扩展机制的类位于该路径。我们自己实现的类,以及第三方类库则位于用户类路径。用户类路径的默认值是当前路径,也就是”.”,可以给java命令传递-classpath选项来指定。
本章示例代码位于classpath包下,同时会修改和完善第一章的cmd.go。
实现类路径
采用组合模式来实现类路径,把类路径当成一个大的整体,由启动类路径、扩展类路径和用户类路径三个小路径构成,三个小路径又分别由更小的路径构成。
下面是Entry接口的部分代码,如果主要只写过Java,可能会不太容易理解Go的接口实现。Entry一共有四种实现,下面挑一个DirEntry来详细看看。
DirEntry表示目录形式的类路径,Go和Java语言不同,Go不需要显示实现接口,只要方法匹配即可。
其他三个实现,这里就不贴出来了,项目中有。四种类路径都实现完之后,再来完善下Entry接口,添加Entry实例的构造方法。
实现Classpath结构体
Classpath结构体有三个字段,分别存放三种类路径,classpath.go代码有点长,这里截取核心的部分展示出来。
测试
需要完善总的测试入口main.go
|
|
搜索class文件的完整功能到此就实现好了,通过本章的学习,对jvm类的路径有了更清晰的认识。