SPI機制原理解析

2021-10-04 06:33:34 字數 1740 閱讀 6666

看了上篇spi使用後,你或許覺得spi太好用了吧,但或許也有疑問:

基於這兩個問題,我們深入**下serviceloader原始碼。

private serviceloader(classsvc, classloader cl)
可以看到建構函式裡呼叫了reload()方法,且android的classloader類沒有使用accesscontroller

public void reload()
初始化了兩個變數providers是用來快取class的,lookupiterator是我們獲取子類繼承的核心處理類了,而classloader本身繼承了iterableiterator()方法裡呼叫lookupiterator來實現重寫方法,serviceloader的操作都是通過該變數來實現的

public iteratoriterator() 

public s next()

public void remove()

};}

lazyiteratoriterator的繼承類,其兩個實現方法hasnext()next()分別呼叫了hasnextservice()nextservice()所以我們只要看這兩個方法就可以了

hasnextservice()

private boolean hasnextservice() 

//初始化配置

if (configs == null) catch (ioexception x)

}//獲取配置檔案裡的繼承類的路徑名稱

while ((pending == null) || !pending.hasnext())

pending = parse(service, configs.nextelement());

}nextname = pending.next();

return true;

}

該方法就是解析我們在meta-inf/services/目錄下配置的介面全路徑名的檔案,讀取裡面的繼承類檔名,來判斷當前節點是否還有繼承類

這裡就可以看到了我們的第乙個問題:

nextservice()

private s nextservice()  catch (classnotfoundexception x) 

if (!service.isassignablefrom(c))

try catch (throwable x)

}

整個lazyiterator的實現就介紹完了

這裡就解釋了第二個問題serviceloader實現原理?他通過lazyiterator類獲取meta-inf/services/目錄下介面對應的檔案,並讀取裡面的繼承類名,然後通過類例項化返回,最終我們就可以獲取到了介面對應實現的子類。

HTTP快取機制與原理解析

http報文分為兩個部分 body 用來存放http傳輸的真正資料 http快取涉及到三個主主體 客戶端瀏覽器,快取資料庫和服務端。而http快取又分為兩種 其基本思想就是 當資料不存在於快取資料庫時,此時會直接去請求伺服器,並把得到的結果寫入快取資料庫中 若資料存在快取資料庫且未過時,則直接去快取...

LCD原理解析

硬體體系 3個部分 lcd液晶 屏 lcd驅動晶元 lcd控制器 整合在arm晶元內部 控制器 通過驅動晶元 控制液晶屏 液晶屏種類 stn gf tft tft 在嵌入式中較為常用 lcd控制器結構與模組 由17個可程式設計的暫存器組和一塊 256 16的調色盤內 存組成,通過這些暫存器,可以配置...

session原理解析

首先session跟cookies都是會會話進行跟蹤,session通過在伺服器端記錄資訊來記錄,cookies通過在客戶端記錄資訊來記錄。在此只對session進行分析 session是記錄在伺服器記憶體中的,每當乙個使用者通過瀏覽器第一次進行訪問時進行建立 需要注意只有訪問jsp,servlet...