鍍金池/ 問答/Java/ 為什么需要線程上下文類加載器來完成SPI調(diào)用外部實現(xiàn)?

為什么需要線程上下文類加載器來完成SPI調(diào)用外部實現(xiàn)?

SPI通過線程上下文類加載器,是怎么實現(xiàn)破壞雙親委派模型的?一個類加載器加載的類不能訪問另一個類加載器加載的類么?如果一個類加載器可以訪問另一個類加載器的類的話,就應(yīng)該不需要線程上下文類加載器的機(jī)制吧?
為什么需要線程上下文類加載器實現(xiàn)調(diào)用外部實現(xiàn)類的方法?不能直接調(diào)用么?如果不用線程上下文類加載器加載,直接被應(yīng)用程序類加載器加載,然后直接new()一個實現(xiàn)類,實現(xiàn)調(diào)用不可以么?

另外,如果非得用線程上下文類加載器實現(xiàn)這樣的調(diào)用外部實現(xiàn)的方式的話,那為什么線程上下文類加載器就可以實現(xiàn)這種調(diào)用?原理是什么?

stackOverflow上:
The thread context classloader is the current classloader for the current thread. An object can be created from a class in ClassLoaderC and then passed to a thread owned by ClassLoaderD. In this case the object needs to use Thread.currentThread().getContextClassLoader() directly if it wants to load resources that are not available on its own classloader.

這段話的具體含義是什么?

SPI實現(xiàn)的Java類一般是由應(yīng)用程序類加載器(Application ClassLoader)來加載的。啟動類無法找到SPI的實現(xiàn)類,因為它只加載核心庫(SPI的實現(xiàn)類由第三方提供)。它(這里的它指的是?)也不能代理給應(yīng)用程序類加載器,因為它(這里的它指的是?)又是應(yīng)用程序類加載器的父類(什么意思?應(yīng)用程序類加載器的父類是什么?),雙親委派模型又會將它交給啟動類來加載。所以在這個時候我們就要“打破”這個“雙親委派模型”。

回答
編輯回答
扯不斷

話說你的spi指的是什么?全稱或中文名是?

2018年1月2日 11:21