Java類加載器。 java
jvm從java1.2開始使用3個類加載器:啓動類加載器(祖父 GF)、擴展類加載器(父親 F)、系統類加載器(兒子 S)。 apache
雙親委託模式: 緩存
當JVM要加載一個類時,S首先被調用,但S不會去直接加載這個類,他會委託給F,而F會委託給GF,若是GF沒有找到這個類就讓F去加載,若是F也沒找到,就讓S去加載。若是最後S也沒找到,就會拋出java.lang.ClassNotFoundException異常。 安全
雙親委託模式有效保證了類加載的安全性:
有人惡意寫了一個java.lang.String類,但願可以替代java核心同名類,當String在程序某處被調用時,S委託F,F委託GF,GF會找到真正的Java核心庫中的String類並加載,而惡意的String不會得到被加載的機會。 app
Web應用在加載servlet和其餘class是要遵照規則的:
servlet只可使用部署在WEB-INF/classes或其子目錄下的class.放在WEB-INF/lib下的jar. jvm
一個Tomcat的Loader表明的是一個Web應用加載器而不是一個類加載器.它必須實現org.apache.catalina.Loader接口.一個Loader的實現擁有一個類加載器(org.apache.catalina.loader.WebappClassLoader)並能夠經過Loader接口中定義的getClassLoader方法得到它。 spa
Loader一般會和一個Context(表明一個Web應用,也是一個容器)綁定在一塊兒,經過Loader接口中定義的getContainer和setContainer方法,得到和設置Context.
操作系統
重加載
若是Conext中的class被改變了,Loader(若是支持的話)會調用Context接口中定義的reload方法從新加載它們,而不須要重啓Tomcat。Loader中定義了setReloadable和getReloadable來決定是否支持重加載。
默認的org.apache.catalina.core.StandardContext是不支持重加載的,若是想要支持,咱們須要在server.xml添加一個Context元素:
<Context path="/myApp" docBase="myApp" debug="0" reloadable="true"/> .net
Loader接口定義
線程
public interface Loader { public ClassLoader getClassLoader(); public Container getContainer(); public void setContainer(Container container); public DefaultContext getDefaultContext(); public void setDefaultContext(DefaultContext defaultContext); public boolean getDelegate(); public void setDelegate(boolean delegate); public String getInfo(); public boolean getReloadable(); public void setReloadable(boolean reloadable); public void addPropertyChangeListener(PropertyChangeListener listener); public void addRepository(String repository); public String[] findRepositories(); public boolean modified(); public void removePropertyChangeListener(PropertyChangeListener listener); }
Tomcat提供了一個Loader的實現:org.apache.catalina.loader.WebappLoader
而且提供了它的類加載器實現:org.apache.catalina.loader.WebappClassLoader(繼承了java.net.URLClassLoader類)
Reloader接口
public interface Reloader { public void addRepository(String repository); public String[] findRepositories (); //true:支持重加載 public boolean modified(); }org.apache.catalina.loader.WebappLoader
org.apache.catalina.loader.WebappClassLoader
緩存加載過的類