JAXB 深入顯出 - JAXB 教程 解讀 JAXBContext
摘要: 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,可以傳入任意物件
相關文章
- jaxb解析xmlXML
- JAXB簡介
- XML - JAXB示例XML
- jaxb輸出xml檔案的中文問題?XML
- 使用JAXB處理JAVA和XMLJavaXML
- JAXB玩轉名稱空間
- 在Gradle中使用jaxb的xjc外掛Gradle
- JAXB解析xml時忽略名稱空間的方法XML
- CXF+Spring+JAXB+Json構建Restful服務SpringJSONREST
- JAXB名稱空間及名稱空間字首處理
- java使用jaxb解析XML(含根據xml自動生成實體類)JavaXML
- java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloaJavaErrorAPIboot
- 元件使用總結:使用 JAXB 實現 XML檔案和java物件互轉元件XMLJava物件
- JAXB(一)——初體驗之實現XML和物件之間的對映XML物件
- Jaxb - com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 8 counts of IllegalAnnotationExceptiXMLException
- 史上最深入淺出的IT術語解讀
- 深入淺出解讀 Spring 原始碼:IOC/AOP 篇Spring原始碼
- Stage模型深入解讀模型
- JDK6.0的新特性之二:使用JAXB2來實現物件與XML之間的對映JDK物件XML
- 最新SS園設計模式例項剖析與深入解讀教程設計模式
- 淺讀-《深入淺出Nodejs》NodeJS
- 深入解讀Quartz的原理quartz
- 精讀《深入淺出Node.js》Node.js
- 深入淺出node讀書筆記筆記
- 《深入淺出MySQL》讀書筆記MySql筆記
- 閱讀推薦——深入淺出Mesos
- 重讀eygle的<<深入淺出oracle>>Oracle
- 深入解讀-微信小程式SDK微信小程式
- JAXBContext版本衝突java.lang.TypeNotPresentException: Type javax.xml.bind.JAXBContext not present atContextJavaExceptionXML
- 深入淺出Nodejs讀書筆記NodeJS筆記
- 讀《深入淺出Node.js》隨感Node.js
- 微信小程式開發深入解讀微信小程式
- 深入瞭解ORACLE的邏輯讀Oracle
- 《深入理解C#》封面解讀C#
- 深入淺出解讀 Java 虛擬機器的差別測試技術Java虛擬機
- 【免費】深入淺出解讀 Spring 原始碼:IOC/AOP 篇 | Chat · 預告Spring原始碼
- JavaScript 深入之從 ECMAScript 規範解讀 thisJavaScript
- 深入解讀Quartz任務排程器quartz