运行逻辑
- 编译时import 检查是否存在此类,存在则编译。
- 代码中的类是否是全名类(带命名空间)。存在,编译载入。
- 类的引用表中是否明确指明引用类。存在,编译载入。
- 无命名空间类是否可与与classpath目录下匹配。存在,编译载入。
- 检查相对类引用表中是否存在。存在,编译载入;多个,报错。
- 不存在,报错。
运作原理
①生成classpath列表。(即获取classpath的值)
②生成类引用表和相对类引用表(例如:在代码中出现import packagename.classname,即将packagename.classname放入类引用表中,在代码中出现import packagename.*,即将packagename.*放入相对类引用表中)
③通过classpath列表分别与类引用表和相对类应用表进行组合,看是否能定位到相应的类或者包,如不能定位或者能够定位一个以上的同名类则报错,否则对相应的类进行编译。
④代码中引用的类是否使用全名(即是否在代码中使用了类的包名),是则转向⑤,否则转向⑥
⑤将全名类与classpath列表匹配定位,对找到的第一个类进行编译,没有找到则报错。
⑥将代码中的无命名空间类与classpath列表匹配,对找到的第一个类进行编译,否则转向⑦
⑦根据classpath列表和相对类引用表进行匹配,看能否定位代码中对应的类。定位到一个则编译,没有或者一个以上则报错。
测试方法
常规测试。即两个类没有任何package和import。
将被调用类加载命名空间,并编译主类。(以联编方式)
- 被调用类存在于正确的命名空间下
- 被调用类同时存在于正确的命名空间下和与主目录平行的位置
- 被调用类的命名空间相对路径存在于与主目录不平行的位置
- 以不同的classpath顺序进行编译运行。
配置好相应目录结构和Java源文件
- 在主类中import不同包下的同名类
- 移去与主类平行的类
- 在import中指明被调用类或在主类中指明被调用类的命名空间
- 在主类中import与主类不平行的命名空间。