- 25
- 0
- 约 7页
- 2017-03-04 发布于北京
- 举报
理解Tomca的tWebappClassLoaderweb应用类加载器一
理解Tomcat的WebappClassLoader(web应用类加载器)一
负责Web应用的类加载的是org.apache.catalina.loader.WebappClassLoader,它几个比较重要的方法:findClass(),loadClass(),findClassInternal(),findResourceInternal().类加载器被用来加载一个类的时候,loadClass()会被调用,loadClass()则调用findClass()。后两个方法是WebappClassLoader的私有方法,findClass()调用findClassInternal()来创建class对象,而findClassInternal()则需要findResourceInternal()来查找.class文件。
通常自己实现类记载器只要实现findclass即可,这里为了实现特殊目的而override了loadClass().
下面是精简过的代码(去除了几乎全部关于log、异常和安全控制的代码):
findClass:
public Class findClass(String name) throws ClassNotFoundException {
// 先试图自己加载类,找不到则请求parent来加载
// 注意这点和java默认的双亲委托模式不同
Class clazz = null;
clazz = findClassInternal(name);
if ((clazz == null) hasExternalRepositories) {
synchronized (this) {
clazz = super.findClass(name);
}
}
if (clazz == null) {
throw new ClassNotFoundException(name);
}
return (clazz);
}
loadClass:
public Class loadClass(String name, boolean resolve)
throws ClassNotFoundException {
Class clazz = null;
// (0) 先从自己的缓存中查找,有则返回,无则继续
clazz = findLoadedClass0(name);
if (clazz != null) {
if (resolve) resolveClass(clazz);
return (clazz);
}
// (0.1) 再从parent的缓存中查找
clazz = findLoadedClass(name);
if (clazz != null) {
if (resolve) resolveClass(clazz);
return (clazz);
}
// (0.2) 缓存中没有,则首先使用system类加载器来加载
clazz = system.loadClass(name);
if (clazz != null) {
if (resolve) resolveClass(clazz);
return (clazz);
}
//判断是否需要先让parent代理
boolean delegateLoad = delegate || filter(name);
// (1) 先让parent加载,通常delegateLoad == false,即这一步不会执行
if (delegateLoad) {
ClassLoader loader = parent;
if (loader == null)
loader = system;
clazz =
您可能关注的文档
最近下载
- 图案变化与统一课件设计.pptx VIP
- 2025年金融风险管理师买入看跌期权与卖出看跌期权策略专题试卷及解析.pdf VIP
- 2025年拍卖师拍卖谈判中的谈判记录与总结技巧专题试卷及解析.pdf VIP
- 2025年房地产经纪人客户隐私保护监管政策解读专题试卷及解析.pdf VIP
- 基于单片机的数控直流稳压电源的设计.docx VIP
- 县域消费扶贫与长效帮扶机制分析.pdf VIP
- 2025年项目管理专业项目交付成果验收检查表编制专题试卷及解析.pdf VIP
- 煤矿露天改扩建项目竣工验收报告.docx
- 人体解剖学复习测试有答案(二).doc VIP
- 基于stm32的智能小车设计毕业设计论文.docx VIP
原创力文档

文档评论(0)