【笔记】深入分析JavaWeb技术内幕-(三)深入分析Class

2017-10-31  本文已影响138人  何小Ai同学

Classloader负责将Class加载到JVM中,并且确定由那个ClassLoader来加载(父优先的等级加载机制)。还有一个任务就是将Class字节码重新解释为JVM统一要求的格式

1.Classloader类结构分析

(1)主要由四个方法,分别是defineClass,findClass,loadClass,resolveClass
(2)实现自定义ClassLoader一般会继承URLClassLoader类,因为这个类实现了大部分方法。

2.ClassLoader的等级加载机制

(1)JVM平台提供三层的ClassLoader,这三层ClassLoader可以分为两类,分别是服务JVM自身的,和服务广大普通类的。分别是:
(2)Jvm加载class文件到内存有两种方式,隐式加载和显示加载,通常这两种方式是混合使用的
(3)上级委托机制:当一个加载器加载类字时,先委托其父加载器加载,若加载成功则反馈给该加载器,若父加载器不能加载,则由该加载器加载

3.如何加载class文件:

分为三个步骤 加载字节码到内存、Linking、类字节初始化赋值

(1)加载字节码到内存:(这一步通常通过findclass()方法实现)

以URLClassLoader为例:该类的构造函数返现必须制定一个URL数据才能创建该对象,该类中包含一个URLClassPath对象,URLClassPath会判断传过来的URL是文件还是Jar包,创建相应的FileLoader或者JarLoader或者默认加载器,当jvm调用findclass时,这些加载器将class文件的字节码加载到内存中

(2)Linking:验证与解析,包含3步:
(3)初始化class对象,执行静态初始化器并在这阶段末尾初始化静态字段为默认值

4.常见加载类错误分析

(1)ClassNotFoundException:

通常是jvm要加载一个文件的字节码到内存时,没有找到这些字节码(如forName,loadClass等方法)

(2)NoClassDefFoundError:

通常是使用new关键字,属性引用了某个类,继承了某个类或接口,但JVM加载这些类时发现这些类不存在的异常

(3)UnsatisfiedLinkErrpr:

如native的方法找不到本机的lib

5.常用classLoader(书本此处其实是对tom加载servlet使用的classLoader分析)

(1)AppClassLoader:

加载jvm的classpath中的类和tomcat的核心类

(2)StandardClassLoader:

加载tomcat容器的classLoader,另外webAppClassLoader在loadclass时,发现类不在JVM的classPath下,在PackageTriggers(是一个字符串数组,包含一组不能使用webAppClassLoader加载的类的包名字符串)下的话,将由该加载器加载(注意:StandardClassLoader并没有覆盖loadclass方法,所以其加载的类和AppClassLoader加载没什么分别,并且使用getClassLoader返回的也是AppClassLoader)(另外,如果web应用直接放在tomcat的webapp目录下该应用就会通过StandardClassLoader加载,估计是因为webapp目录在PackageTriggers中?)

(3)webAppClassLoader如:

Servlet等web应用中的类的加载(loadclass方法的规则详见P169)

6.自定义的classloader

(1)需要使用自定义classloader的情况
(2)加载自定义路径中的class文件

7.实现类的热部署:

注意:使用不同classLoader加载的同一个类文件得到的类,JVM将当作是两个不同类,使用单例模式,强制类型转换时都可能因为这个原因出问题。

原书链接

以上内容只是个人笔记记录,更多完整内容请购买作者原书籍查看。《深入分析JavaWeb技术内幕》

上一篇 下一篇

猜你喜欢

热点阅读