⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 classloader in tomcat[转贴加修改]--rosonsandy.htm

📁 这是最详细的对Tomcat4以上版本的解析。
💻 HTM
📖 第 1 页 / 共 4 页
字号:
</SPAN>WebApp1<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>WebApp2<SPAN 
style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>|&nbsp;</SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 36pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 1.2pt 687.0pt 732.8pt" 
align=left><SPAN lang=EN-US 
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"></SPAN><SPAN 
lang=EN-US 
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><SPAN 
style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN>+-----------------------------+ </SPAN></P>
<P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" 
align=left><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">其中:<SPAN 
lang=EN-US><BR>- Bootstrap - </SPAN>载入<SPAN lang=EN-US>JVM</SPAN>自带的类和<SPAN 
lang=EN-US>$JAVA_HOME/jre/lib/ext/*.jar<BR>- System - </SPAN>载入<SPAN 
lang=EN-US>$CLASSPATH/*.class<BR>- Common - </SPAN>载入<SPAN 
lang=EN-US>$CATALINA_HOME/common/...</SPAN>,它们对<SPAN 
lang=EN-US>TOMCAT</SPAN>和所有的<SPAN lang=EN-US>WEB APP</SPAN>都可见<SPAN 
lang=EN-US><BR>- Catalina - </SPAN>载入<SPAN 
lang=EN-US>$CATALINA_HOME/server/...</SPAN>,它们仅对<SPAN 
lang=EN-US>TOMCAT</SPAN>可见,对所有的<SPAN lang=EN-US>WEB APP</SPAN>都不可见<SPAN 
lang=EN-US><BR>- Shared - </SPAN>载入<SPAN 
lang=EN-US>$CATALINA_HOME/shared/...</SPAN>,它们仅对所有<SPAN lang=EN-US>WEB 
APP</SPAN>可见,对<SPAN lang=EN-US>TOMCAT</SPAN>不可见(也不必见)<SPAN lang=EN-US><BR>- 
WebApp - </SPAN>载入<SPAN lang=EN-US>ContextBase?/WEB-INF/...</SPAN>,它们仅对该<SPAN 
lang=EN-US>WEB APP</SPAN>可见<SPAN lang=EN-US> </SPAN></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" 
align=left><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><SPAN 
lang=EN-US></SPAN></SPAN></P>
<P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-outline-level: 3" 
align=left><B><SPAN lang=EN-US 
style="FONT-SIZE: 13.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">2 
- ClassLoader</SPAN></B><B><SPAN 
style="FONT-SIZE: 13.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">的工作原理<SPAN 
lang=EN-US> </SPAN></SPAN></B></P>
<P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" 
align=left><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">每个运行中的线程都有一个成员<SPAN 
lang=EN-US>contextClassLoader</SPAN>,用来在运行时动态地载入其它类<SPAN 
lang=EN-US><BR></SPAN>系统默认的<SPAN lang=EN-US>contextClassLoader</SPAN>是<SPAN 
lang=EN-US>systemClassLoader</SPAN>,所以一般而言<SPAN 
lang=EN-US>java</SPAN>程序在执行时可以使用<SPAN lang=EN-US>JVM</SPAN>自带的类、<SPAN 
lang=EN-US>$JAVA_HOME/jre/lib/ext/</SPAN>中的类和<SPAN 
lang=EN-US>$CLASSPATH/</SPAN>中的类<SPAN lang=EN-US><BR></SPAN>可以使用</SPAN><SPAN 
lang=EN-US 
style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">Thread.currentThread().setContextClassLoader(...);</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">更改当前线程的<SPAN 
lang=EN-US>contextClassLoader</SPAN>,来改变其载入类的行为<SPAN lang=EN-US> 
</SPAN></SPAN></P>
<P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" 
align=left><SPAN lang=EN-US 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">ClassLoader</SPAN><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">被组织成树形,一般的工作原理是:<SPAN 
lang=EN-US><BR>1) </SPAN>线程需要用到某个类,于是<SPAN 
lang=EN-US>contextClassLoader</SPAN>被请求来载入该类<SPAN lang=EN-US><BR>2) 
contextClassLoader</SPAN>请求它的父<SPAN lang=EN-US>ClassLoader</SPAN>来完成该载入请求<SPAN 
lang=EN-US><BR>3) </SPAN>如果父<SPAN lang=EN-US>ClassLoader</SPAN>无法载入类,则<SPAN 
lang=EN-US>contextClassLoader</SPAN>试图自己来载入<SPAN lang=EN-US> </SPAN></SPAN></P>
<P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" 
align=left><B><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">注意</SPAN></B><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">:<SPAN 
lang=EN-US>WebApp?ClassLoader</SPAN>的工作原理和上述有少许不同:<SPAN 
lang=EN-US><BR></SPAN>它先试图自己载入类(在<SPAN 
lang=EN-US>ContextBase?/WEB-INF/...</SPAN>中载入类),如果无法载入,再请求父<SPAN 
lang=EN-US>ClassLoader</SPAN>完成<SPAN lang=EN-US> </SPAN></SPAN></P>
<P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" 
align=left><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">由此可得:<SPAN 
lang=EN-US><BR>- </SPAN>对于<SPAN lang=EN-US>WEB APP</SPAN>线程,它的<SPAN 
lang=EN-US>contextClassLoader</SPAN>是<SPAN lang=EN-US>WebApp?ClassLoader<BR>- 
</SPAN>对于<SPAN lang=EN-US>Tomcat Server</SPAN>线程,它的<SPAN 
lang=EN-US>contextClassLoader</SPAN>是<SPAN lang=EN-US>CatalinaClassLoader 
</SPAN></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" 
align=left><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><SPAN 
lang=EN-US></SPAN></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" 
align=left><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><SPAN 
lang=EN-US></SPAN></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" 
align=left><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><SPAN 
lang=EN-US><STRONG>3 类的查找</STRONG></SPAN></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" 
align=left><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><SPAN 
lang=EN-US>ClassLoader类中loadClass方法为缺省实现,用下面的顺序查找类:</SPAN></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" 
align=left><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><SPAN 
lang=EN-US>1、调用findLoadedClass方法来检查是否已经被加载。如果没有则继续下面的步骤。</SPAN></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" 
align=left><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><SPAN 
lang=EN-US>2、如果当前类装载器有一个指定的委托父装载器,则用委托父装载器的loadClass方法加载类,也就是委托给父装载器加载相应的类。</SPAN></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" 
align=left><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><SPAN 
lang=EN-US>3、如果这个类装载器的委托层级体系没有一个类装载器加载该类,则使用类装载器定位类的特定实现机制,调用findClass方法来查找类。</SPAN></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" 
align=left><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><SPAN 
lang=EN-US></SPAN></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" 
align=left><SPAN 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"><SPAN 
lang=EN-US></SPAN></SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" 
align=left><B><SPAN lang=EN-US 
style="FONT-SIZE: 13.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">4&nbsp;- 
</SPAN></B><B><SPAN 
style="FONT-SIZE: 13.5pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">部分原代码分析<SPAN 
lang=EN-US> </SPAN></SPAN></B></P>
<P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" 
align=left><B><SPAN lang=EN-US 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">4.1 
- org/apache/catalina/startup/Bootstrap.java </SPAN></B></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" 
align=left><SPAN lang=EN-US 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">Bootstrap中定义了三个classloader:commonLoader,catalinaLoader,sharedLoader.三者关系如下:</SPAN></P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" 
align=left><SPAN lang=EN-US 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体"></SPAN></P><SPAN 
lang=EN-US 
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" 
align=left><SPAN lang=EN-US 
style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'">//</SPAN><SPAN 
style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'">注意三个自己定置的<SPAN 
lang=EN-US>ClassLoader</SPAN>的层次关系:<SPAN lang=EN-US>&nbsp;</SPAN></SPAN> </P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" 
align=left><SPAN 
style="FONT-SIZE: 9pt; COLOR: green; FONT-FAMILY: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><SPAN 
lang=EN-US></SPAN></SPAN><SPAN lang=EN-US 
style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><SPAN 
style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</SPAN><SPAN style="COLOR: green">// systemClassLoader 
(root)&nbsp;</SPAN></SPAN> </P>
<P class=MsoNormal 
style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" 
align=left><SPAN lang=EN-US 
style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><SPAN 
style="COLOR: green"></SPAN></SPAN><SPAN lang=EN-US 
style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><SPAN 
style="mso-spacerun: yes">&nbsp;&nbsp;</SPAN><SPAN 
style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN 
style="COLOR: green">//<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>+--- 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -