如對源文件的加載,對jar中依賴的class文件進行加載,而且須要將最終生成的class文件進行寫出。這就須要一個統一的文件模塊來處理,其中涉及到的主要類以下:java
一、Paths、Path優化
二、ZipArchivespa
三、BaseFileObjectorm
四、JavacFileManager對象
(1)實例對象的獲取blog
(2)經常使用API繼承
編譯一個Java源代碼涉及到對各類類型文件讀取與寫入,最通常的就是對.java文件與.class文件的讀取了。另外在編譯Java源文件時,通常涉及到的依賴都是以.class格式的文件存在的,而且這些文件通常是放到包中。Java類庫大多以壓縮包形式存儲,如*.jar,實際上,lib目錄下的ct.sym也是壓縮包,javac在編譯類時,若是要使用JDK中rt.jar提供的一些類庫API,那麼會使用ct.sym。這樣作是避免當java開發人員調整這些接口時形成客戶端代碼沒法運行。 接口
Java中處理最多的就是.class與.java結尾的文件,這些文件都以對象來表示而且須要專門進行管理,其文件對象的繼承體系以下:ip
如圖所示,Javac中每一個與文件相關的實現類都直接或間接實現了JavaFileObject接口,這個接口專門爲操做.java文件及.class文件而定義的。開發
每一個RegularFileObject類對象能夠表明一個Java源文件,多個源文件會封裝爲List<JavaFileObject>集合進行編譯,若是這些源文件中有對其它類的依賴,如:
package compile;
import java.util.List;
public class Test{
List<String> 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類型的文件,將會搜索到<java_home>/lib和<java_home>/ext包下的jar文件。
這兩個路徑只有在指定了-classpath或者-sourcepath時纔會有用。
一、當 -sourcepath 沒有指定時,在 -classpath 路徑裏面搜索 .class 和 .java 文件
二、當 -sourcepath 指定時,只搜索 -classpath 路徑下的 .class 文件,即便-classpath 路徑下有要找的.java文件也會不搜索這個文件
三、 -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)優化