第二章-文件加载与输出

 

如对源文件的加载,对jar中依赖的class文件进行加载,并且需要将最终生成的class文件进行写出。这就需要一个统一的文件模块来处理,其中涉及到的主要类如下:

1、Paths、Path

2、ZipArchive

3、BaseFileObject

4、JavacFileManager

(1)实例对象的获取

(2)常用API

 

 

1、概述

编译一个Java源代码涉及到对各种类型文件读取与写入,最一般的就是对.java文件与.class文件的读取了。另外在编译Java源文件时,一般涉及到的依赖都是以.class格式的文件存在的,并且这些文件一般是放到包中。Java类库大多以压缩包形式存储,如*.jar,实际上,lib目录下的ct.sym也是压缩包,javac在编译类时,如果要使用JDK中rt.jar提供的一些类库API,那么会使用ct.sym。这样做是避免当java开发人员调整这些接口时造成客户端代码无法运行。 

 

Java中处理最多的就是.class与.java结尾的文件,这些文件都以对象来表示并且需要专门进行管理,其文件对象的继承体系如下:

第二章-文件加载与输出_第1张图片

如图所示,Javac中每个与文件相关的实现类都直接或间接实现了JavaFileObject接口,这个接口专门为操作.java文件及.class文件而定义的。

每个RegularFileObject类对象可以代表一个Java源文件,多个源文件会封装为List集合进行编译,如果这些源文件中有对其它类的依赖,如: 

package compile;

import java.util.List;

public class Test{
	List l = null;
}

可以看到有对java.util包下的List类的依赖,那么就会通过一定的规则搜索这个依赖类,具体搜索的路径通过StandardLocation进行指定,代码如下:

public enum StandardLocation implements Location {
    /**
     * Location to search for user class files.
     */
    CLASS_PATH,

    /**
     * Location to search for existing source files.
     */
    SOURCE_PATH,

    /**
     * Location to search for annotation processors.
     */
    ANNOTATION_PROCESSOR_PATH,

    /**
     * Location to search for platform classes.  Sometimes called
     * the boot class path.
     */
    PLATFORM_CLASS_PATH;
    // ... 省略了其它一些属性及方法
}

对.java及.class文件的搜索路径进行了归类,主要是4大类:

(1)PLATFORM_CLASS_PATH

(2)SOURCE_PATH

(3)CLASS_PATH

(4)ANNOTATION_PROCESSOR_PATH

 

优先在此类别的路径下搜索.class类型的文件,将会搜索到/lib和/ext包下的jar文件。 

这两个路径只有在指定了-classpath或者-sourcepath时才会有用。

1、当 -sourcepath 没有指定时,在 -classpath 路径里面搜索 .class 和 .java 文件

2、当 -sourcepath 指定时,只搜索 -classpath 路径下的 .class 文件,即使-classpath 路径下有要找的.java文件也会不搜索这个文件

3、 -sourcepath 只搜索 .java 文件,不搜索 .class 文件。因此应该避免用 -sourcepath,而只用 -classpath 来指定搜索 .class 和 .java 文件的路径

 

  

 

而之前提到的ct.sym压缩包在Javac中表示一个ZipFileIndexFileObject类对象。

 

 

 

 

 

 

 

(2)依赖路径查找 主要是平台路径,如Platform_class_path,class_path、source_path与annotation_processor_path。Paths类解读


(3)加载及处理依赖包


(4)使用依赖相关类

JavacFileManager
RelativeDirectory
Relativefile

(5)优化

 

你可能感兴趣的:(第二章-文件加载与输出)