JAXB 深入顯出 - JAXB 教程 解讀 JAXBContext

cj96248發表於2018-09-03

摘要: JAXB 作為JDK的一部分,能便捷地將Java物件與XML進行相互轉換,本教程從實際案例出發來講解JAXB 2 的那些事兒。完整版目錄

課前導讀

JAXBContext 是整個 JAXB API 的入口。主要用來構建 JAXB 例項(newInstance()),並提供與XML/Java繫結資訊相關的抽象,如編組(createMarshaller())、解組(createUnmarshaller())和驗證(createValidator())。其中與驗證相關的方法已廢棄(Deprecated),被Validator所替代。

newInstance()

應用程式可以通過多種途徑獲得 JAXBContext 例項,它們擁有相同的函式名,只是引數不同。

建立 JAXB 例項,最常見的方式是傳入特定的class.

JAXBContext instance = JAXBContext.newInstance(Student.class);

使用類名 Xxx.class

如果存在同名的Java物件,則可以指定完整路徑:

JAXBContext instance = JAXBContext.newInstance(com.example.bean.Student.class);

使用包路徑加上類名 com.x.xx.Xxx.class

如果有多個物件需要註冊,則可以:

JAXBContext instance = JAXBContext.newInstance(Student.class, Teacher.class);

多個類之間使用逗號分隔開

或者也可以對某一個package包下所有的物件編組:

JAXBContext instance = JAXBContext.newInstance("com.example.bean");

傳入完整包名。這時候並不是指定的包中所有的Class都會用來建立JAXBContext。按照JAXB的規範,我們需要在對應的包中建立一個jaxb.index檔案,然後在其中指定建立JAXBContext時需要用到的Class,每個Class名稱佔一行。否則,會報錯 "com.example.bean" 不包含 ObjectFactory.class 或 jaxb.index

甚至對多個package包下所有的物件編組:

JAXBContext instance = JAXBContext.newInstance("com.example.bean:com.example.pojo");

完整包名之間使用冒號分隔開

createMarshaller()

建立一個Marshaller物件,用於將Java內容轉換為XML資料。

對使用工廠方法手動建立的內容進行編組與unmarshal操作結果的內容進行編組沒有本質區別。客戶端可以將Java內容編組成java.io.OutputStream或者java.io.Writer的XML資料。編組程式可以生成已經註冊號的SAX2事件流,也可以生成一個DOM節點物件。

createUnmarshaller()

建立一個可以用來將 XML 資料轉換為 java 內容樹的 Unmarshaller 物件。
該方法允許將模式中宣告的任何全域性 XML 元素解組為例項文件的根元素。

createBinder()

建立一個可用於關聯/原地解組/編組操作的 Binder 物件。如果不傳引數,預設使用W3C DOM建立一個Binder。

靜態方法提供者 JAXB

javax.xml.bind.JAXB是2.1版本新增的工具類,其中所有的 public 方法均為靜態方法,可以直接通過類名呼叫。它存在的意義就是幫助使用者簡單,快速上手JAXB。

JAXBContext

被快取的JAXBContext,為了效能上的考慮,將會對JAXBContext做快取,不過快取使用到了WeakReference,不用擔心 GC 問題。

JAXB.unmarshal(…)

有很多過載的方法,方便使用者傳入不同型別的引數。使用者不需要關心實現的細節,傳入你需要轉換的資料,加上需要生成的類,就能得到需要的資料。

public static <T> T unmarshal( ..., Class<T> type ) {}

返回值使用的是泛型T,可以得到任意物件

JAXB.marshal(…)

同樣有很多過載的方法,方便使用者傳入不同型別的引數。

public static void marshal( Object jaxbObject, ... ) {}

第一個引數是物件Obj,可以傳入任意物件

相關文章