Tomcat Server在啟動的時候將構造一個ClassLoader樹,以保證模塊的類庫是私有的
Tomcat Server的ClassLoader結構如下:
每個運行中的線程都有一個成員contextClassLoader,用來在運行時動態地載入其它類,系統默認的 contextClassLoader是systemClassLoader,所以一般而言java程序在執行時可以使用JVM自帶的類、$ JAVA_HOME/jre/lib/ext/中的類和$CLASSPATH/中的類,可以使用Thread.currentThread(). setContextClassLoader(...);更改當前線程的contextClassLoader,來改變其載入類的行為
ClassLoader被組織成樹形,一般的工作原理是:
1) 線程需要用到某個類,于是contextClassLoader被請求來載入該類
2) contextClassLoader請求它的父ClassLoader來完成該載入請求
3) 假如父ClassLoader無法載入類,則contextClassLoader試圖自己來載入
注重:WebApp?ClassLoader的工作原理和上述有少許不同:
它先試圖自己載入類(在ContextBase?/WEB-INF/...中載入類),假如無法載入,再請求父ClassLoader完成
由此可得:
- 對于WEB APP線程,它的contextClassLoader是WebApp?ClassLoader
- 對于Tomcat Server線程,它的contextClassLoader是CatalinaClassLoader
新聞熱點
疑難解答