如对源文件的加载,对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结尾的文件,这些文件都以对象来表示并且需要专门进行管理,其文件对象的继承体系如下:
如图所示,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类型的文件,将会搜索到
这两个路径只有在指定了-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)优化