第二章-文件加載與輸出

 

如對源文件的加載,對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)優化

相關文章
相關標籤/搜索