簡(jiǎn)介:?對(duì)于許多關(guān)鍵性業(yè)務(wù)或者龐大的 Java 系統(tǒng)來說,如果必須暫停系統(tǒng)服務(wù)才能進(jìn)行系統(tǒng)升級(jí),既會(huì)大大影響到系統(tǒng)的可用性,同時(shí)也增加了系統(tǒng)的管理和維護(hù)成本。因此,如果能夠方便地在不停止系統(tǒng)業(yè)務(wù)的情況下進(jìn)行系統(tǒng)升級(jí),則可以很好地解決上述問題。在本文中,我們將基于實(shí)例,對(duì)構(gòu)建在線升級(jí) Java 系統(tǒng)的基礎(chǔ)技術(shù)和設(shè)計(jì)原則進(jìn)行了深入的講解。相信讀者能夠根據(jù)文中的技術(shù)構(gòu)建出自己的在線升級(jí)系統(tǒng)來。
Java ClassLoader 技術(shù)剖析
在本文中,我們將不對(duì) Java ClassLoader 的細(xì)節(jié)進(jìn)行過于詳細(xì)的講解,而是關(guān)注于和構(gòu)建在線升級(jí)系統(tǒng)相關(guān)的基礎(chǔ)概念。關(guān)于 ClassLoader 的詳細(xì)細(xì)節(jié)許多資料可以參考,有興趣的讀者可以自行研讀。
要構(gòu)建在線升級(jí)系統(tǒng),一個(gè)重要的技術(shù)就是能夠?qū)崿F(xiàn) Java 類的熱替換 —— 也就是在不停止正在運(yùn)行的系統(tǒng)的情況下進(jìn)行類(對(duì)象)的升級(jí)替換。而 Java 的 ClassLoader 正是實(shí)現(xiàn)這項(xiàng)技術(shù)的基礎(chǔ)。
在 Java 中,類的實(shí)例化流程分為兩個(gè)部分:類的加載和類的實(shí)例化。類的加載又分為顯式加載和隱式加載。大家使用 new 關(guān)鍵字創(chuàng)建類實(shí)例時(shí),其實(shí)就隱式地包含了類的加載過程。對(duì)于類的顯式加載來說,比較常用的是 Class.forName。其實(shí),它們都是通過調(diào)用 ClassLoader 類的 loadClass 方法來完成類的實(shí)際加載工作的。直接調(diào)用 ClassLoader 的 loadClass 方法是另外一種不常用的顯式加載類的技術(shù)。
圖 1. Java 類加載器層次結(jié)構(gòu)圖