tomcat6类加载器与类加载顺序

Author:dyyx007 东阳游侠
http://hi.baidu.com/ajf8/home
http://weibo.com/dyyx007


tomcat6.0.32


com.dyyx.ShareUtils
//返回系统当前时间
public static String now();

package com.dyyx;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ShareUtils {
private static final String FULL_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static String now() {
Date now = new Date();
DateFormat dateFormat = new SimpleDateFormat(FULL_DATE_FORMAT);
return dateFormat.format(now);
}
}

http://127.0.0.1:8080/tools/share_utils_now.jsp


share_utils_now.jsp 里调用 ShareUtils.now() 输出当前时间
并且会调用getClassLoadInfo(Class c) 方法 输出 ShareUtils.class 的类加载器信息 代码如下

public static String getClassLoadInfo(Class c) {
String rname = getResourceName(c);
URL url = null;
ClassLoader cl = c.getClassLoader();
// 如果ClassLoader为NULL 为系统类
if (null == cl) {
url = ClassLoader.getSystemResource(rname);
} else {
url = cl.getResource(rname);
}
String s = "class=" + c + ",classloader:" + cl + ",url=" + url;
s = s + ",resourceName=" + rname;
s = s + "\n\n";
while (cl != null) {
cl = cl.getParent();
s = s + cl + "\n";

}
return s;
}

public static String getResourceName(Class clazz) {
if (null == clazz) {
return "class is null";
}
String cname = clazz.getName();
String[] arr = cname.split("\\.");
String rname = "";
int len = arr.length;
for (int i = 0; i < len; i++) {
if (i > 0) {
rname = rname + "/";
}
rname = rname + arr[i];
}
rname = rname + ".class";
return rname;
}


share-utils.jar 包含 ShareUtils.class


类加载顺序
${JAVA_HOME}/jre/lib/ext
java classpath
${webapp}/WEB-INF/classes
${webapp}/WEB-INF/lib
${tomcat.home}/lib


bootstrap class loader 引导类加载器 加载java核心类库 不是java.lang.ClassLoader的实例
ExtClassLoader 的父加载器为 bootstrap class loader 但是 getParent()拿到是null


把 share-utils.jar 或 ShareUtils.class 依次从相应的目录移除


以下为各种类加载情况日志记录


1 ExtClassLoader ${JAVA_HOME}/jre/lib/ext
class=class com.dyyx.ShareUtils,classloader:sun.misc.Launcher$ExtClassLoader@addbf1,url=jar:file:/D:/soft/jdk1.6.0_21/jre/lib/ext/share-utils.jar!/com/dyyx/ShareUtils.class,resourceName=com/dyyx/ShareUtils.class

null

2 AppClassLoader java classpath
class=class com.dyyx.ShareUtils,classloader:sun.misc.Launcher$AppClassLoader@19821f,url=jar:file:/D:/tomcat6min/bin/share-utils.jar!/com/dyyx/ShareUtils.class,resourceName=com/dyyx/ShareUtils.class

sun.misc.Launcher$ExtClassLoader@addbf1
null

3 WebappClassLoader ${webapp}/WEB-INF/classes

class=class com.dyyx.ShareUtils,classloader:WebappClassLoader
context:
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@1172e08
,url=file:/D:/soft/book/high/code/action/webroot/WEB-INF/classes/com/dyyx/ShareUtils.class,resourceName=com/dyyx/ShareUtils.class

org.apache.catalina.loader.StandardClassLoader@1172e08
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null


4 WebappClassLoader ${webapp}/WEB-INF/lib

class=class com.dyyx.ShareUtils,classloader:WebappClassLoader
context:
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@1172e08
,url=jar:file:/D:/soft/book/high/code/action/webroot/WEB-INF/lib/share-utils.jar!/com/dyyx/ShareUtils.class,resourceName=com/dyyx/ShareUtils.class

org.apache.catalina.loader.StandardClassLoader@1172e08
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null


5 StandardClassLoader ${tomcat.home}/lib

class=class com.dyyx.ShareUtils,classloader:org.apache.catalina.loader.StandardClassLoader@1172e08,url=jar:file:/D:/tomcat6min/lib/share-utils.jar!/com/dyyx/ShareUtils.class,resourceName=com/dyyx/ShareUtils.class

sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null


双亲委派模型

引导类加载器 扩展类加载器 应用(系统)类加载器 自定义类加载器(L1) 自定义类加载器(L2) 自定义类加载器(Ln) ......

tomcat6类加载器示意图 http://hiphotos.baidu.com/ajf8/pic/item/3a7fe938b6003af37d7927d2352ac65c1238b6ea.jpg

原文链接 http://hi.baidu.com/ajf8/blog/item/055bac5394f386100df3e3f9.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值