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
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
发表评论
-
缓存对比
2016-03-20 20:29 0最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有 ... -
负载均衡
2016-03-20 20:22 0对软件实现负载均衡的几个软件,小D详细看了一下,从性能和稳定上 ... -
API 限流
2016-03-20 16:55 0服务接口API限流 一、场景描述 ... -
做项目时需要考虑的安全性问题
2013-04-19 11:38 498做项目时需要考虑的安全性问题 转:http://ningand ... -
Java中可扩展性
2013-04-18 16:54 0第一招:所有功能,不论客户端还是服务端,全部面向服务开发,使用 ... -
(转)网站架构资料收集整理
2013-04-19 11:38 6401.系统概况图 图1.1 系 ... -
远程调用对比RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS
2013-04-18 11:19 0在分布式服务框架中, ... -
EhCache使用详细介绍(转)
2013-04-18 10:24 617EhCache使用详细介绍(转) Ehcache中不仅可以用配 ... -
Java中可扩展性的实现
2013-04-18 10:25 972Java中可扩展性的实现 在JAVA中程序的可扩 ... -
灵活性和可扩展性
2013-04-16 13:44 0通常成对出现。程序 ... -
Node.js 究竟是什么?
2013-04-17 00:00 508Node.js 究竟是什么? 简 ... -
Node.js初体验
2013-04-16 11:23 0服务器端 JS 情缘 在校 ... -
Tomcat性能调优-让小猫飞奔
2013-04-17 00:01 589Tomcat性能调优-让小猫飞奔 apacheApacheco ... -
大型在线系统实现的关键
2013-04-16 10:40 612负载均衡--大型在线 ...
相关推荐
类加载器之所以能实现类隔离,是因为两个类相等的前提是它们由同一个类加载器加载,否则必定不相等。 JVM 在加载时,采用的是一种双亲委托机制,当类加载器要加载一个类时,加载顺序是: 首先将请求委托给父加载器,...
7.1.3 对象与类的关系 7.2 定义类 7.2.1 MasterCard类的实现 7.2.2 MasterCard类的使用 7.2.3 访问控制 7.2.4 构造方法 7.2.5 方法的参数 7.2.6 封装与隐藏 7.2.7 finalize()方法 7.3 静态域与静态方法 ...
9.2用Class类来加载对象289 9.3使用getClass()方法获取类信息290 9.4使用类标记292 9.5使用关键字instanceof判断所属类292 9.6利用反射获取运行时类信息293 9.6.1使用isInstance()方法判断所属类294 9.6.2获取...
但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...
16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 17.介绍一下Hibernate的二级缓存 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message 属性, ...
SSH(struts+spring+hibernate)的jar包 SSH 通常指的是 Struts2 做前端控制器,Spring ...配置文件加载顺序为:default.properties -> struts-default.xml -> struts-plugins.xml -> struts.xml -> struts.locale。
以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 107 84.4. 现在输入n个数字,以逗号”,”分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset 108 84.5. 金额...
3.2.2 类装载器ClassLoader 3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 ...
3.2.2 类装载器ClassLoader 3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 ...
数据定义 基本数据操作 数据完整性 表达式 连接 合并 子...Tomcat安装和配置 JRun 3.0安装和配置 安装检索 附录E 在WebLogic 6.0上配置并部署EJB 设置配置属性 生成EJB容器类 加载...
以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 31 6. 写一段Jdbc连Oracle的程序. 32 7. 编码实现内部类 34 8. 输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按...
6、Div与Table的区别 13 7、行级标签转块级标签,块级标签转行级标签 13 二、Java基础部分 13 1、java中有哪些基本类型? 13 2、java为什么能够跨平台运行? 13 3、String是基本数据类型吗?我可不可以写个类继承于...
但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...
16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...
16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...
16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message...
16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...
16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...
16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...