看了上篇spi使用後,你或許覺得spi太好用了吧,但或許也有疑問:
基於這兩個問題,我們深入**下serviceloader
原始碼。
private serviceloader(classsvc, classloader cl)
可以看到建構函式裡呼叫了reload()
方法,且android的classloader
類沒有使用accesscontroller
public void reload()
初始化了兩個變數providers
是用來快取class的,lookupiterator
是我們獲取子類繼承的核心處理類了,而classloader
本身繼承了iterable
在iterator()
方法裡呼叫lookupiterator
來實現重寫方法,serviceloader
的操作都是通過該變數來實現的
public iteratoriterator()
public s next()
public void remove()
};}
lazyiterator
是iterator
的繼承類,其兩個實現方法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...