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 - com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 8 counts of IllegalAnnotationExceptiXMLException
- java使用jaxb解析XML(含根據xml自動生成實體類)JavaXML
- Jaxb - 生成帶名稱空間和節點字首的Xml的方式XML
- 元件使用總結:使用 JAXB 實現 XML檔案和java物件互轉元件XMLJava物件
- 深入解讀Dictionary
- 深入淺出解讀 Spring 原始碼:IOC/AOP 篇Spring原始碼
- 淺讀-《深入淺出Nodejs》NodeJS
- Stage模型深入解讀模型
- 最新SS園設計模式例項剖析與深入解讀教程設計模式
- 深入解讀Quartz的原理quartz
- 深入淺出node讀書筆記筆記
- 精讀《深入淺出Node.js》Node.js
- JAXBContext版本衝突java.lang.TypeNotPresentException: Type javax.xml.bind.JAXBContext not present atContextJavaExceptionXML
- 深入淺出解讀 Java 虛擬機器的差別測試技術Java虛擬機
- Kubernetes Gateway API 深入解讀和落地指南GatewayAPI
- 定時器JS深入理解解讀定時器JS
- 深入解讀:KubeVela 與 PaaS 有何不同?
- 【深入淺出ES6】解構
- 什麼是鎖?深入分析解讀MySQL鎖,解決幻讀問題!MySql
- 【原創】【深入淺出系列】之程式碼可讀性
- MVCC詳解,深入淺出簡單易懂MVC
- JDK11執行springboot專案出現:Type javax.xml.bind.JAXBContext not presentJDKSpring BootJavaXMLContext
- 深入解讀A/B 測試的統計學原理
- 精讀《深入瞭解現代瀏覽器四》瀏覽器
- 精讀《深入瞭解現代瀏覽器三》瀏覽器
- 精讀《深入瞭解現代瀏覽器二》瀏覽器
- 精讀《深入瞭解現代瀏覽器一》瀏覽器
- 深入淺出FE(十四)深入淺出websocketWeb
- 檔案隨機或順序讀寫原理深入淺出隨機
- 深入淺出瞭解“裝箱與拆箱”
- 深入淺出MyBatis:「對映器」全瞭解MyBatis
- 學術乾貨|深入淺出解讀 Java 虛擬機器的差別測試技術Java虛擬機
- 深入 JavaScript 原型繼承原理——babel 編譯碼解讀JavaScript原型繼承Babel編譯
- 深入解讀Service Mesh 背後的技術細節
- 4 月 25 日直播預告 | 深入解讀 Flink 1.17
- Python3 原始碼閱讀-深入瞭解Python GILPython原始碼
- 深入解讀HashMap執行緒安全性問題HashMap執行緒
- 深入解讀Prometheus Adapter:雲原生監控的核心元件PrometheusAPT元件