摘要:內部類提供本服務的服務的類型算法名稱本服務的實現類的名稱別名列表空如果服務沒有別名屬性映射空如果實現沒有屬性以的算法為例輸出的結果其中查看支持的密鑰類型繼承類函數前三種是類的全路徑名稱帶有后三種中的方法返回中所有的條目返回中所有的條目中
java.security.Provider 內部類Service
/** * Construct a new service. * * @param provider 提供本服務的Provider * @param type 服務的類型 * @param algorithm 算法名稱 * @param className 本服務的實現類的名稱 * @param aliases 別名列表|空(如果服務沒有別名) * @param attributes 屬性映射|空(如果實現沒有屬性) * * @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()輸出的結果
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類函數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
根據Type和algorithm獲取Service
public synchronized Service getService(String type, String algorithm)
繼承自Property的函數
添加 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的轉換
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); } } }
調用parseLegacyPut(),實際是將type,algorithm等轉換成Map
引擎類在getInstance()的時候去調用Provider.getService(type,algorithm)方法,通過ServiceKey(type,algorithm)獲取到Service.
然后在引擎類的getInstance()中調用service.newInstance()返回引擎類spi的實例
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76920.html
摘要:此文用于匯總跟隨陳雷老師及團隊的視頻,學習源碼過程中的思考整理與心得體會,此文會不斷更新視頻傳送門每日學習記錄使用錄像設備記錄每天的學習源碼學習源碼學習內存管理筆記源碼學習內存管理筆記源碼學習內存管理筆記源碼學習基本變量筆記 此文用于匯總跟隨陳雷老師及團隊的視頻,學習源碼過程中的思考、整理與心得體會,此文會不斷更新 視頻傳送門:【每日學習記錄】使用錄像設備記錄每天的學習 PHP7...
摘要:實際上的綁定主要有三種方式且只是一種的,這些已經在學習筆記之實例化源碼解析聊過,其實現方法并不復雜。從以上源碼發現的反射是個很好用的技術,這里給出個,看下能干些啥打印結果太長了,就不粘貼了。 說明:本文主要學習Laravel中Container的源碼,主要學習Container的綁定和解析過程,和解析過程中的依賴解決。分享自己的研究心得,希望對別人有所幫助。實際上Container的綁...
摘要:源碼學習筆記基于包源碼大致分為以下幾組對包集合框架的擴展更好的支持多線程并發操作線程池相關鎖基本數據類型的原子性封裝 Java concurrent 源碼學習筆記基于JDK1.8 concurrent包源碼大致分為以下幾組: 對util包集合框架的擴展(更好的支持多線程并發操作) 線程池相關 鎖 基本數據類型的原子性封裝 showImg(https://segmentfault.c...
閱讀 2579·2023-04-26 03:00
閱讀 1392·2021-10-12 10:12
閱讀 4190·2021-09-22 15:33
閱讀 2908·2021-09-22 15:06
閱讀 1530·2019-08-30 15:44
閱讀 2145·2019-08-30 13:59
閱讀 534·2019-08-30 11:24
閱讀 2407·2019-08-29 17:07