学习Tomcat(六)之类加载器】的更多相关文章

一.前言 类加载器,其实是很复杂一个东西,想等到我完全什么都弄明白了再写出来,估计不太现实...现在只能是知道多少写多少吧. 首先,我提一个问题:在我们自己的servlet中(比如ssm中,controller的代码),可以访问 tomcat 安装目录下 lib 中的类吗?(servlet-api.jar包中的不算) 好好思考一下再回答.如果你说不可以,那可能接下来会有点尴尬... 二.测试 1.tomcat 类加载器结构复习 咱们看图说话,应用程序类加载器,主要加载classpath路径下的类…
我们知道我们编写的java代码,会经过编译器编译成字节码文件(class文件),再把字节码文件装载到JVM中,映射到各个内存区域中,我们的程序就可以在内存中运行了.那么字节码文件是怎样装载到JVM中的呢?中间经过了哪些步骤?常说的双亲委派模式又是怎么回事?本文主要搞清楚这些问题. 类装载流程 1.加载 加载是类装载的第一步,首先通过class文件的路径读取到二进制流,并解析二进制流将里面的元数据(类型.常量等)载入到方法区,在java堆中生成对应的java.lang.Class对象. 2.连接…
Java虚拟机利用类加载器将类载入内存,以供使用.在此过程中类加载器要做很多的事情,例如读取字节数组.验证.解析.初始化等.而Java提供的URLClassLoader类能方便地将jar.class或网络资源加载到内存.Tomcat中则用一个工厂类ClassLoaderFactory把创建类加载器的细节进行封装,通过它可以很方便地创建自定义的类加载器.   如上图,利用createClassLoader方法并传入资源路径跟父类加载器即可创建一个自定义类加载器,此类加载器负责加载传入的所有资源.…
一.类加载器 1.类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 1.1 加载: 就是指将class文件读入内存,并为之自动创建一个Class对象(字节码对象). 任何类被使用时系统都会建立一个Class对象. 1.2 连接 验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值 解析 将类的二进制数据中的符号引用替换为直接引用 1.3 初始化 就是初始化步骤 2.类初始化时…
什么是类加载器? 这是官方给的定义 在 Java 虚拟机的实现中,初始类可以作为命令行参数提供. 或者,该实现可以提供一个初始类,该类设置一个类加载器,该类加载器依次加载应用程序. 初始类的其他选择也是可能的,只要它们与上一段中给出的规范一致. 所谓类加载器,就是用于加载Java类到Java虚拟机中的组件,它负责读取Java字节码,并转换成java.lang.Class类的一个实例,使字节码.class 文件得以运行.一般类加载器负责根据一个指定的类找到对应的字节码,然后根据这些字节码定义一个J…
可以通过“java.system.class.loader"属性指定系统类加载器 默认情况下,该属性值为空: public class Test { public static void main(String[] args) { System.out.println(System.getProperty("java.system.class.loader")); System.out.println(Test.class.getClassLoader()); System.…
扩展类加载器独有的特点,代码如下 public class Sample { } public class Test { static { System.out.println("Test static block"); } public static void main(String[] args) { System.out.println(Test.class.getClassLoader()); System.out.println(Sample.class.getClassLo…
通过前面的文章我们知道,Tomcat的请求最终都会交给用户配置的servlet实例来处理.Servlet类是配置在配置文件中的,这就需要类加载器对Servlet类进行加载.Tomcat容器自定义了类加载器,有以下特殊功能:1. 在载入类中指定某些规则:2.缓存已经载入的类:3.实现类的预加载. 本文会对Tomcat的类加载器进行详细介绍. Java类加载双亲委派模型 Java类加载器是用户程序和JVM虚拟机之间的桥梁,在Java程序中起了至关重要的作用,关于其详细实现可以参考了java官方文档关…
了解了类加载器的双亲委派机制, 也知道了双亲委派机制的原理,接下来就是检验我们学习是否扎实了,来自定义一个类加载器 一. 回顾类加载器的原理 还是这张图,类加载器的入口是c++调用java代码创建了JVM启动器,其中的一个启动器是sun.misc.Launcher启动器.这个启动器启动并加载的AppClassLoader和ExtClassLoader.然后调用launcher.getClassLoader()方法获取loader对象, loader对象本质是一个ClassLoader,然后调用了…
一.tomcat是个web容器,要解决以下问题 1. 一个web容器可能要部署两个或者多个应用程序,不同的应用程序,可能会依赖同一个第三方类库的不同版本,因此要保证每一个应用程序的类库都是独立.相互隔离的. 2. 部署在同一个web容器中的相同类库的相同版本可以共享,否则,会有重复的类库被加载进JVM 3. web容器也有自己的类库,不能和应用程序的类库混淆,需要相互隔离 4. web容器支持jsp文件修改后不用重启,jsp文件也是要编译成.class文件的,支持HotSwap功能 二.tomc…