- 浏览: 290572 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lsy812198178:
写的很好,有收获
Java内部类的作用 -
JsonLiangyoujun:
关于第四点,同时继承一个类和实现一个接口的话,重写的应该是父类 ...
Java内部类的作用 -
chenluhe123:
非常感谢楼主分享,浅显易懂
Java内部类的作用 -
唐予之.:
学有所获,非常感谢
Java内部类的作用 -
o22221234:
...
Java内部类的作用
阿里的面试题,当场晕了
http://blog.csdn.net/codolio/archive/2009/12/17/5027423.aspx
加载类是运行程序的基础,了解Java和Tomcat的类加载机制对更有效地开发、调试Web应用程序有一定的积极作用。本文简单介绍Java和Tomcat的类加载机制,希望对大家有所帮助。
•JDK/JRE文件结构
在安装JDK后,其典型的目录层次如下所示(JDK 1.6.0):
主要的目录和JAR简述如下:
•<JAVA_HOME>\bin: 包含在JDK中的开发工具的可执行文件,一般而言,PATH环境变量应包含该目录。
•<JAVA_HOME>\lib: 开发工具使用的文件,其中包括(1)tools.jar:该JAR包包含支持JDK中工具类和实用类的非核心类。同时也包含(2)dt.jar:BeanInfo使用的设计时(DesignTime)归档文件,该JAR包告诉IDE如何显示Java组件和如何让开发者定制它们。其中主要包含Swing的相关类。
•<JAVA_HOME>\jre\lib:包含Java运行时环境使用的核心类、属性设置和资源文件等。例如:(1)rt.jar:引导类(组成Java平台核心API的运行时类);(2)charsets.jar:字符转换类。
在一个典型的Web应用环境中,在设置CLASSPATH环境变量是,通常需要包含以下条目:
•设置好path变量,使得我们能够在系统中的任何地方运行java应用程序,比如javac、java、javah等等,变量值: C:\jdk1.6.0\bin;
•classpath环境变量,是当我们在开发java程序时需要引用别人写好的类时,要让java解释器知道到哪里去找这个类。C:\jdk1.6.0\lib\tools.jar;C:\jdk1.6.0\lib\dt.jar。
•设置JAVA_HOME: 了方便引用。C:\jdk1.6.0
注:在使用Tomcat作为Servlet/JSP容器的Web环境中,Tomcat在启动过程中清除了原有CLASSPATH的内容,并对其进行了重新定义。细节见下文。
•Java类加载机制
Java启动器(java)初始化Java虚拟机。虚拟机按照如下顺序搜索加载类:
1.引导类:组成Java平台的类,包括rt.jar和一些别的重要的jar文件;
2.扩展类:使用Java扩展机制的类,这些类捆绑成JAR文件,并被放置在扩展目录中;每一个在jre/lib/ext扩展目录下的JAR文件均被设定为一个扩展并使用Java扩展架构加载;
3.用户类:由开发者定义的类和没有利用扩展机制的第三方类,这些类的位置由用户指定,一般通过使用-classpath命令行选项或者使用CLASSPATH环境变量来指定其位置。
与之相对应,自从J2SE 1.2规范起,JVM就已经利用了三种不同的类加载器:
•引导类(Bootstrap)加载器(也称为初始类加载器);
•扩展类加载器;
•系统类加载器。
这些类加载器是有层次的,系统类加载器位于底层,而引导类加载器位于上层,它们之间的关系为父-子关系。
•引导类加载器:引导类加载器用于JVM加载那些它运行所需的Java类。实际上,引导类加载器负责加载所有核心的Java类(如java.lang.*和java.io.*)。一般各种JVM厂商(包括Sun)使用本地代码实现引导类加载器。
•扩展类加载器:Java 1.2引入了标准扩展机制。可以将JAR文件放置在标准扩展目录,JVM将能自动地找到它们。扩展类加载器负责加载一个或者多个扩展目录中的所有类。一般情况下,只要安装了Java运行环境(JRE),那么扩展目录为<JRE>/lib/ext。扩展类加载器可以不是独立的类加载器,一些实现也许甚至允许引导类加载器从扩展目录加载类。
•系统类加载器:系统类加载器在CLASSPATH环境变量指定的JAR文件中查找自己的类,或通过-classpath命令行选项传递该类,如果没有指定,则默认使用当前目录。系统加载器也用于加载应用程序的entry point类(即含有main()方法的类),对于那些其他任何没有涵盖在以上两类加载器中的类,都默认使用系统类加载器。
•委派模型:JVM通过利用委派模型知道将使用哪个类加载器。Java JDK 1.2以后的版本,无论类加载器何时收到加载类的请求。在一个类加载器试图加载一个请求的类之前,它委派该加载请求到其父类类加载器,直到引导类加载器。如果父类加载器成功加载所请求的类,那么就返回作为结果的类对象,只有当父类加载器未能加载该类的情况下,原始的类加载器才尝试装载该类。
注:类加载器的更多行为:
•懒散加载:上述类加载器并没有预加载在搜索该路径中的所有类。相反它按要求加载类。这样的行为称为懒散加载。
•类缓存:标准的Java SE类加载器可以按要求查找类,但一旦某个类被加载到类加载器中,它将维持加载(缓存)一段时间。不过,JVM垃圾收集器可以回收这些Class对象。
•独立的命名空间:为每个类加载器分配了唯一的命名空间。
•Apache Tomcat 5.5 Servlet/JSP类加载机制:
同其它服务器应用程序类似,Tomcat 5安装了多种类加载器(即,实现了java.lang.ClassLoader接口的类),来允许容器的不同部分和运行在容器中的Web应用程序来访问不同可用类和资源的库。
当Tomcat 5启动时,它创建了一套类加载器,这些加载器组织成如下的父子关系,其中父类加载器位于子类加载器之上(Tomcat 6.0版本的类加载器层次结构发生了变化):
加载器定义如下:
•Bootstrap:该加载器包含由JVM提供的基本的运行时类,加上放置在系统扩展目录(<JAVA_HOME\jre\lib\ext>)的JAR文件中的类。注:一些JVM将该加载器实现为一个以上的类加载器,或者它完全不可见;
•System:系统加载器,该加载器通常使用CLASSPATH环境变量来初始化。但是标准的Tomcat 5启动脚本(<CATALINA_HOME>/bin/catalina.sh或者<CATALINA_HOME>\bin\catalina.bat>)完全忽略了CLASSPATH环境变量的内容,并使用下述库来构建System类加载器。如下:
从上图可以看出,Tomcat使用的CLASSPATH并非我们先前配置的目录。
<CATALINA_HOME>\bin\bootstrap.jar:包含初始化Tomcat 5服务器的main()方法和它所依赖的类加载器实现;
<JAVA_HOME>\lib\tools.jar:包含" javac "编译器用来将JSP页面转化为servlet类;
<CATALINA_HOME>\bin\commons-logging-api-x.y.z.jar:包含commons logging API;
<CATALINA_HOME>\bin\commons-daemon.jar:包含commons daemon API;
jmx.jar :包含JMX 1.2实现。
•Common:该类加载器包含一些对Tomcat内部类和web应用可见的额外类。其中包括(1)jasper-compiler.jar:JSP 2.0编译器(2)jsp-api.jar:JSP 2.0 API(3)servlet-api.jar:servlet 2.4 API等等。
•Catalina:该加载器初始化用来包含实现Tomcat 5本身所需要所有类和资源;
•Shared:在所有的web应用程序间共享的类和资源;
•WebappX:为每个部署在单个Tomcat 5实例上的Web应用创建的类加载器。加载/WEB-INF/classes和WEB-INF/lib下的类和资源。
值得注意的是,Web应用程序类加载器行为与默认的Java 2委派模型不同。当一个加载类的请求被WebappX类加载器处理时,类加载器将首先查看本地库,而非在查看前就委派,但是也有例外,作为JRE基本类一部分的类不能被覆盖,但是对与一些类,可以使用J2SE 1.4的Endorsed Standards Override机制。最后,任何包含servlet API的JAR包都将被该类加载器忽略。Tomcat 5所有其它的类加载器遵循常用的委派模式。具体细节请参见Tomcat 5的参考文档。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/codolio/archive/2009/12/17/5027423.aspx
发表评论
-
JAVA向上转型
2012-03-14 14:47 1189http://wwty.iteye.com/blog/7246 ... -
子类重写父类的方法时声明抛出异常不能比父类范围大
2011-10-09 23:29 1677http://hi.baidu.com/lurim/blog/ ... -
Java中类对象之间的类型转换
2011-05-23 10:46 1101http://hi.baidu.com/angel%B5%C4 ... -
jdbc批量插入数据库
2011-05-23 10:44 934http://apps.hi.baidu.com/share/ ... -
jdk 的动态代理和CGLIB代理
2011-03-19 21:35 3834jdk的代理分为静态代理和动态代理,静态代理用的很少,一般都是 ... -
Java 反射经典实例
2011-03-19 21:28 1036http://tonyaction.blog.51cto.co ... -
JDK、JRE、JVM之间的关系
2011-03-19 15:49 1041http://www.cjsdn.net/post/view? ... -
JAVA RMI 实例
2011-03-14 23:29 1077[转]http://damies.iteye.com/blog ... -
Clone使用方法详解
2011-03-11 21:30 1115网新一笔试题,关于clone()的,糊里糊涂不会,看了这文章, ... -
JAVA基础--JAVA中的反射机制详解
2011-03-06 16:57 1067【转】http://java.ccidnet.com/art ... -
unicode、ascii、utf-8的关系
2011-01-12 19:46 889http://www.ruanyifeng.com/blog/ ... -
Java中assertion的使用
2011-01-09 19:22 1448assertion的使用是一个复杂的问题,因为 ... -
Comparator与Comparable的区别
2011-01-09 16:02 1125当需要排序的集合或数 ... -
Java对象的序列化和反序列化实践
2011-01-05 20:59 886当两个进程在进行远程 ... -
Eclipse中的visual editor 下载和安装[亲身体验过]
2010-12-25 12:54 10728装这个插件我从21点一直弄到凌晨1点半,终于搞定!总结来说这么 ... -
关于JAVA的PO与VO
2010-12-20 20:23 1185我一直很矛盾:是否PO ... -
数据库连接池,数据源,数据库连接,JNDI,JAVA
2010-12-20 09:27 1702连接数据库的两种方式: 在Java应用程序中,数据库的连接一 ... -
Java中synchronize的两种用法
2010-12-15 21:13 2565synchronized 关键字,它包括两种用法:synchr ... -
Java创建对象的四种方法
2010-12-13 23:44 1395有4种显式地创建对象的方式: 1.用new语句创建对象,这是最 ... -
Java之static用法(详解)
2010-12-13 22:40 945在Java语言中,static表示 ...
相关推荐
在Java Web开发中,Tomcat作为最常用的Servlet容器,其类加载机制对于理解和优化应用性能至关重要。本文将深入探讨Tomcat的ClassLoader是如何工作的,以及它如何影响到我们的应用程序。 首先,理解类加载器...
在Tomcat中,类加载机制的设计是为了支持多个Web应用程序的隔离运行。每个Web应用都有自己的类加载器,这样可以确保一个应用的类不会意外地与另一个应用的类混淆。默认的类加载器结构包括以下层次: 1. Bootstrap ...
总之,理解Java类加载器和Tomcat的类加载机制对于开发和调试基于Tomcat的应用程序至关重要。它涉及到类的查找、加载、初始化等过程,以及如何通过调整类加载器配置来优化应用性能和安全性。深入研究这些概念,能够让...
当Tomcat加载类时,它遵循以下顺序: - 使用Bootstrap类加载器尝试加载。 - 使用System类加载器尝试加载。 - 使用Webapp类加载器加载`WEB-INF/classes`下的类。 - 使用Webapp类加载器加载`WEB-INF/lib`中的jar...
因此,让Tomcat自动加载修改过的类和Servlet成为提高开发效率的关键需求之一。 ### 让Tomcat自动加载修改过的类和Servlet #### 知识点一:理解Tomcat的热部署机制 Tomcat默认情况下并不会自动检测到类或Servlet的...
Java和Tomcat源码是两个重要的软件开发领域中的核心组件,它们对于理解Web应用程序的运行机制和提升开发者技能至关重要。Java是一种广泛使用的编程语言,以其跨平台性、面向对象特性和丰富的类库闻名。而Tomcat则是...
例如,在大型企业级应用和容器(如Tomcat)中,类加载机制的理解和利用是优化系统性能和维护性的关键。 总的来说,Java类加载机制是一个复杂但重要的主题,涉及到类加载器、类的生命周期、双亲委派模型以及自定义...
Tomcat通过自定义的类加载器实现了特定的类加载顺序,以确保能够正确处理不同来源的类文件,避免类的重复加载和类版本冲突问题。以下是Tomcat启动过程中类加载的具体顺序: #### 三、类加载顺序详述 1. **Bootstrap...
类加载器的工作机制遵循“双亲委派模型”:当一个类加载器接收到加载类的请求时,它首先会委托父加载器去尝试加载,只有在父加载器无法加载的情况下,子加载器才会尝试自己去加载。这种设计可以防止类的重复加载,并...
这些MXBeans可以为我们提供关于Java虚拟机(JVM)的详细信息,包括线程、运行时、内存和类加载等方面的数据。 在Tomcat中,我们可以通过以下步骤获取信息: 1. **启动Tomcat的JMX代理**: 在Tomcat的`conf/server....
在Java的运行环境中,类加载器扮演着至关重要...在处理类冲突、版本控制和热部署等问题时,理解Tomcat的类加载机制至关重要。开发者在进行应用部署和配置时,必须考虑到类加载器的层次和行为,以避免潜在的问题和冲突。
- Tomcat作为流行的Java Web服务器,有自己的类加载机制。它包括Web应用程序类加载器,用于加载特定Web应用的类,以及全局类加载器,用于共享所有应用的类。这种设计允许Web应用独立更新而不影响其他应用。 5. 类...
Tomcat是Apache软件基金会的开源项目,是一款广泛使用的Java Servlet容器,用于部署和运行Java Web应用程序。在MyEclipse中配置Tomcat进行动态加载,能够让开发者在不重启服务器的情况下实现应用的热更新,提高开发...
Apache Tomcat作为一款广泛使用的开源Servlet容器,其类加载机制是理解和维护基于Tomcat的应用程序的重要部分。Tomcat的类加载器遵循特定的加载顺序,确保了不同应用间的隔离性和资源的正确加载。下面将详细解析...
总的来说,这段代码展示了如何利用 Java 反射机制在 Tomcat 中动态加载外部 JAR 文件,并执行其中的类和方法。需要注意的是,这种做法通常只适用于开发或测试环境,不推荐在生产环境中频繁使用,因为它可能会影响...
此外,通过实现javax.servlet.Servlet接口,我们可以定义一个简单的Servlet,由Tomcat负责加载和执行。 五、结论 通过本文的分析,我们不仅深入了解了Tomcat的工作原理,还学习了其各个组件的作用和相互关系。...
5. "tomcat加载类的顺序.doc":详细说明了Tomcat加载类的具体步骤和顺序,这对于理解和调试类加载问题至关重要。 6. "Tomcat源码研究.pdf":提供了一个全面的源码分析概览,可能包括了Tomcat的主要组件、设计模式...
Tomcat 类加载器的实现主要围绕着Java的类加载机制进行,旨在确保应用之间的类隔离,并提供灵活的资源访问策略。下面我们将深入探讨这些知识点。 首先,Java的类加载机制是基于“双亲委托模型”的。当一个类加载器...
4. **部署**:在Tomcat中部署Java Web应用通常涉及创建一个WAR(Web ARchive)文件,这是包含所有Web应用资源(如HTML、CSS、JavaScript、Servlet类和JSP文件)的压缩文件。将WAR文件复制到Tomcat的`webapps`目录下...