摘要:內(nèi)部類提供本服務(wù)的服務(wù)的類型算法名稱本服務(wù)的實(shí)現(xiàn)類的名稱別名列表空如果服務(wù)沒有別名屬性映射空如果實(shí)現(xiàn)沒有屬性以的算法為例輸出的結(jié)果其中查看支持的密鑰類型繼承類函數(shù)前三種是類的全路徑名稱帶有后三種中的方法返回中所有的條目返回中所有的條目中
java.security.Provider 內(nèi)部類Service
/** * Construct a new service. * * @param provider 提供本服務(wù)的Provider * @param type 服務(wù)的類型 * @param algorithm 算法名稱 * @param className 本服務(wù)的實(shí)現(xiàn)類的名稱 * @param aliases 別名列表|空(如果服務(wù)沒有別名) * @param attributes 屬性映射|空(如果實(shí)現(xiàn)沒有屬性) * * @throws NullPointerException if provider, type, algorithm, or * className is null */ public Service(Provider provider, String type, String algorithm, String className, Listaliases, Map attributes)
以BC的RSA算法為例toString()輸出的結(jié)果
BC: Cipher.RSA -> org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi$NoPadding aliases: [RSA//RAW, RSA//NOPADDING] attributes: {SupportedKeyFormats=PKCS#8|X.509, SupportedKeyClasses=javax.crypto.interfaces.RSAPublicKey|javax.crypto.interfaces.RSAPrivateKey} BC: Cipher.RSA/OAEP -> org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi$OAEPPadding aliases: [RSA//OAEPPADDING]
其中:
Service.className = org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi$NoPadding
Service.type = Cipher
Service.algorithm = RSA
查看支持的密鑰類型:
public boolean supportsParameter(Object parameter)
attributes:SupportedKeyFormats=PKCS#8|X.509
繼承Properties類函數(shù)put
Key=
type.algorithm
type.oid
type.OID.oid
Alg.Alias.type.algorithm
Alg.Alias.type.oid
Alg.Alias.type.OID.oid
value = className
key = type.algorithm(前三種),value是spi類的全路徑名稱
key = 帶有Alg.Alias..(后三種),value = type.algorithm中的algorithm.
方法
返回Provider中所有的property條目Set
public synchronized Set> entrySet()
返回Provider中所有的Property條目中的Set
public Set
返回Provider中所有的Property條目中的Collection
public Collection
根據(jù)Type和algorithm獲取Service
public synchronized Service getService(String type, String algorithm)
繼承自Property的函數(shù)
添加 public synchronized Object put(Object key, Object value) public synchronized void putAll(Map,?> t) 刪除 public synchronized Object remove(Object key) public synchronized void clear() 獲取 public Object get(Object key) public String getProperty(String key)type,algorithm到service的轉(zhuǎn)換
provider.put(key,value) name = key,value = value private void parseLegacyPut(String name, String value) { if (name.toLowerCase(ENGLISH).startsWith(ALIAS_PREFIX_LOWER)) { // e.g. put("Alg.Alias.MessageDigest.SHA", "SHA-1"); // aliasKey ~ MessageDigest.SHA String stdAlg = value; String aliasKey = name.substring(ALIAS_LENGTH); String[] typeAndAlg = getTypeAndAlgorithm(aliasKey); if (typeAndAlg == null) { return; } String type = getEngineName(typeAndAlg[0]); String aliasAlg = typeAndAlg[1].intern(); ServiceKey key = new ServiceKey(type, stdAlg, true); Service s = legacyMap.get(key); if (s == null) { s = new Service(this); s.type = type; s.algorithm = stdAlg; legacyMap.put(key, s); } legacyMap.put(new ServiceKey(type, aliasAlg, true), s); s.addAlias(aliasAlg); } else { String[] typeAndAlg = getTypeAndAlgorithm(name); if (typeAndAlg == null) { return; } int i = typeAndAlg[1].indexOf(" "); if (i == -1) { // e.g. put("MessageDigest.SHA-1", "sun.security.provider.SHA"); String type = getEngineName(typeAndAlg[0]); String stdAlg = typeAndAlg[1].intern(); String className = value; ServiceKey key = new ServiceKey(type, stdAlg, true); Service s = legacyMap.get(key); if (s == null) { s = new Service(this); s.type = type; s.algorithm = stdAlg; legacyMap.put(key, s); } s.className = className; } else { // attribute // e.g. put("MessageDigest.SHA-1 ImplementedIn", "Software"); String attributeValue = value; String type = getEngineName(typeAndAlg[0]); String attributeString = typeAndAlg[1]; String stdAlg = attributeString.substring(0, i).intern(); String attributeName = attributeString.substring(i + 1); // kill additional spaces while (attributeName.startsWith(" ")) { attributeName = attributeName.substring(1); } attributeName = attributeName.intern(); ServiceKey key = new ServiceKey(type, stdAlg, true); Service s = legacyMap.get(key); if (s == null) { s = new Service(this); s.type = type; s.algorithm = stdAlg; legacyMap.put(key, s); } s.addAttribute(attributeName, attributeValue); } } }
調(diào)用parseLegacyPut(),實(shí)際是將type,algorithm等轉(zhuǎn)換成Map
引擎類在getInstance()的時(shí)候去調(diào)用Provider.getService(type,algorithm)方法,通過ServiceKey(type,algorithm)獲取到Service.
然后在引擎類的getInstance()中調(diào)用service.newInstance()返回引擎類spi的實(shí)例
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76920.html
摘要:此文用于匯總跟隨陳雷老師及團(tuán)隊(duì)的視頻,學(xué)習(xí)源碼過程中的思考整理與心得體會(huì),此文會(huì)不斷更新視頻傳送門每日學(xué)習(xí)記錄使用錄像設(shè)備記錄每天的學(xué)習(xí)源碼學(xué)習(xí)源碼學(xué)習(xí)內(nèi)存管理筆記源碼學(xué)習(xí)內(nèi)存管理筆記源碼學(xué)習(xí)內(nèi)存管理筆記源碼學(xué)習(xí)基本變量筆記 此文用于匯總跟隨陳雷老師及團(tuán)隊(duì)的視頻,學(xué)習(xí)源碼過程中的思考、整理與心得體會(huì),此文會(huì)不斷更新 視頻傳送門:【每日學(xué)習(xí)記錄】使用錄像設(shè)備記錄每天的學(xué)習(xí) PHP7...
摘要:實(shí)際上的綁定主要有三種方式且只是一種的,這些已經(jīng)在學(xué)習(xí)筆記之實(shí)例化源碼解析聊過,其實(shí)現(xiàn)方法并不復(fù)雜。從以上源碼發(fā)現(xiàn)的反射是個(gè)很好用的技術(shù),這里給出個(gè),看下能干些啥打印結(jié)果太長(zhǎng)了,就不粘貼了。 說明:本文主要學(xué)習(xí)Laravel中Container的源碼,主要學(xué)習(xí)Container的綁定和解析過程,和解析過程中的依賴解決。分享自己的研究心得,希望對(duì)別人有所幫助。實(shí)際上Container的綁...
摘要:源碼學(xué)習(xí)筆記基于包源碼大致分為以下幾組對(duì)包集合框架的擴(kuò)展更好的支持多線程并發(fā)操作線程池相關(guān)鎖基本數(shù)據(jù)類型的原子性封裝 Java concurrent 源碼學(xué)習(xí)筆記基于JDK1.8 concurrent包源碼大致分為以下幾組: 對(duì)util包集合框架的擴(kuò)展(更好的支持多線程并發(fā)操作) 線程池相關(guān) 鎖 基本數(shù)據(jù)類型的原子性封裝 showImg(https://segmentfault.c...
閱讀 2594·2023-04-26 03:00
閱讀 1408·2021-10-12 10:12
閱讀 4203·2021-09-22 15:33
閱讀 2931·2021-09-22 15:06
閱讀 1544·2019-08-30 15:44
閱讀 2155·2019-08-30 13:59
閱讀 543·2019-08-30 11:24
閱讀 2429·2019-08-29 17:07