tomcat6类加载器与类加载顺序
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
null
3 WebappClassLoader ${webapp}/WEB-INF/classes
class=class com.dyyx.ShareUtils,classloader:WebappClassLoader
context:
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
,url=file:/D:/soft/book/high/code/action/webroot/WEB-INF/classes/com/dyyx/ShareUtils.class,resourceName=com/dyyx/ShareUtils.class
null
4 WebappClassLoader ${webapp}/WEB-INF/lib
class=class com.dyyx.ShareUtils,classloader:WebappClassLoader
context:
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
,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
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
null
双亲委派模型
引导类加载器 扩展类加载器 应用(系统)类加载器 自定义类加载器(L1) 自定义类加载器(L2) 自定义类加载器(Ln) ......
tomcat6类加载器与类加载顺序的更多相关文章
- java类加载器-Tomcat类加载器
在上文中,已经介绍了系统类加载器以及类加载器的相关机制,还自定制类加载器的方式.接下来就以tomcat6为例看看tomat是如何使用自定制类加载器的.(本介绍是基于tomcat6.0.41,不同版本可 ...
- ClassLoader类加载器 & Java类加载机制 & 破坏双亲委托机制
ClassLoader类加载器 Java 中的类加载器大致可以分成两类: 一类是系统提供的: 引导类加载器(Bootstrap classloader):它用来加载 Java 的核心库(如rt.jar ...
- JVM(一)类加载器与类加载过程
JVM是面试必面的一个知识点,也是高级程序员必备的一个技能.以下是JVM整体核心内容,包括类加载系统,运行时数据区内部结构,执行引擎,本地方法接口. 首先来学习类的加载器,虚拟机把描述类的数据从Cla ...
- JVM学习笔记——类加载器与类加载过程
类加载器与类加载过程 类加载器ClassLoader 类加载器 ClassLoader 用于把 class 文件装载进内存. 启动类加载器(Bootstrap ClassLoader): 这个类加载使 ...
- java类加载器-系统类加载器
系统类加载器 系统类加载器可能都耳详能熟,但是为了完整点,还是先简单的说说系统的类加载器吧. public class Test { public static void main(String[] ...
- Class.forName(String name)方法,到底会触发那个类加载器进行类加载行为?
4.2 在代码中直接调用Class.forName(String name)方法,到底会触发那个类加载器进行类加载行为? Class.forName(String name)默认会使用调用类的类加载器 ...
- java类加载器-----用户自定义类加载器实现
java类加载器主要分为如下几种: jvm提供的类加载器 根类加载器:底层实现,主要加载java核心类库(如:java.lang.*) 扩展类加载器:使用java代码实现,主要加载如:jre/lib/ ...
- JVM 修改类加载器启动类加载器
1.类加载器加载路径 public class MyTest18 { public static void main(String[] args) { //系统类加载器加载路径 System.out. ...
- 【JVM进阶之路】十四:类加载器和类加载机制
在上一章里,我们已经学习了类加载的过程,我们知道在加载阶段需要"通过一个类的全限定名来获取描述该类的二进制字节流",而来完成这个工作的就是类加载器(Class Loader). 1 ...
随机推荐
- HTML + JS随机抽号。
[设置第三次抽取的号码为 (张三6)]<script language="javascript"> var k = 0 ; function star(){ k++ ; ...
- python 调用nmap
1.系统中需要安装nmap 2.系统中安装pip 2.安装python调用nmap的lib包 命令为:pip install python-nmap 以下是在centos系统下安装成功后的截图 在命令 ...
- 调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置
调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (三)使用Windbg调试SQLSERVER ...
- Javascript自己动手实现getter/setter
虽然ES5中为我们提供了Object.defineProperty方法来设置getter与setter,但此原生方法使用起来并不方便,我们何不自己来实现一个类,只要继承该类并遵循一定的规范就可以拥有媲 ...
- 【css3】--四种气泡
在聊天的场景中,聊天内容需要用到气泡修饰,如下图.下面一一讲解. 图片式: 第一个样式是京东客服,气泡的圆角和钩子都是用了图片.使用了一个table组合成了一个圆角的框框.lm样式拼出了钩子. < ...
- [.net 面向对象编程基础] (20) LINQ使用
[.net 面向对象编程基础] (20) LINQ使用 通过上节LINQ的基础知识的学习,我们可以开始使用LINQ来进行内存数据的查询了,我们上节说了LINQ的定义为:Language Integr ...
- 利用avalon 实现一个简单的成绩单
本文的灵感是来自Halower的这篇博文,他是使用knockout与jQuery实现的.不过我觉得MVVM本来就强大的事件绑定功能,因此用jQuery 是多此一举.另,他也用了一些面向对象的写法.我个 ...
- Web 架构师的能力(转)
文/刘如鸿 最近和几个朋友在谈到时下流行的Web 2.0,也提到了其中最重要的角色——架构师.多方各有争执,不外乎是因为背景和视角的缘故,包括架构一词,本身就从建筑学借鉴而来,至于架构师,则可以 简单 ...
- [stm32] 一个简单的stm32vet6驱动的天马4线SPI-1.77寸LCD彩屏DEMO
书接上文<1.一个简单的nRF51822驱动的天马4线SPI-1.77寸LCD彩屏DEMO> 我们发现用16MHz晶振的nRF51822驱动1.77寸的spi速度达不到要求 本节主要采用7 ...
- pydev+eclipse+python3.4运行hello word,提示Error in sitecustomize; set PYTHONVERBOSE for traceback:
刚开始学习python,按照网上步骤搭建好pydev+eclipse的开发环境,运行print("hello world")提示下面错误: Error in sitecustomi ...