java 类加载机制及CLassLoader

[toc]

java 类加载

这是复习的所以比较简略和深入的总结一下

加载的生命周期

加载:”加载”是”类加载”过程的一个阶段,此阶段完成的功能是:

  通过类的全限定名来获取定义此类的二进制字节流

  将此二进制字节流所代表的静态存储结构转化成方法区的运行时数据结构

  在内存中生成代表此类的java.lang.Class对象,作为该类访问入口.

验证:连接阶段第一步.验证的目的是确保Class文件的字节流中信息符合虚拟机的要求,不会危害虚拟机安全,使得虚拟机免受恶意代码的攻击.大致完成以下四个校验动作:
– 文件格式验证
– 源数据验证
– 字节码验证
– 符号引用验证

准备:连接阶段第二步,正式为类变量分配内存并设置变量的初始值.(仅包含类变量,不包含实例变量).

解析:连接阶段第三步,虚拟机将常量池中的符号引用替换为直接引用,解析动作主要针对类或接口,字段,类方法,方法类型等等..

初始化:类的初始化是类加载过程的最后一步,在该阶段,才真正意义上的开始执行类中定义的java程序代码.该阶段会执行类构造器.

使用:使用该类所提供的功能.

卸载:从内存中释放.

classload

java可以从以下四个路径进行动态的加载到内存里面
1. 从ZIP包中进项加载,
2. 从网络中获取,Applet
3. 运行时计算生成,java的动态代理模式
4. 从其他文件中生成,JSP生成;

ClassLoad类
是负责加载类对象的,是一个抽象类,给定类的二进制名称,类加载器会试图查找或生成类定义的数据.
每个class对象都包含一个对定义它的ClassLoader的引用
数组类的Class对象不是由类加载器来创建的,是由java运行时根据需要自动创建的,其类加载器是Class.getClassLoader()返回的

3种类加载器:
Bootstrap ClassLoader:启动类– 负责讲<JAVA_HOME>\lib类库加载到虚拟机内存中,用来加载java的核心库,此类加载器并不继承于java.lang.ClassLoader,不能被java程序直接调用,代码是使用C++编写的.是虚拟机自身的一部分.
Extendsion CLassLoader:扩展类加载器–这个类加载器负责加载\lib\ext目录下的类库,用来加载java的扩展库,开发者可以直接使用这个类加载器.
Application ClassLoader:应用程序类加载器–负责加载用户类路径(CLASSPATH)下的类库,一般我们编写的java类都是由这个类加载器加载,这个类加载器是CLassLoader中的getSystemClassLoader()方法的返回值,所以也称为系统类加载器.一般情况下这就是系统默认的类加载器.

双亲委派模型

亲委派模型是一种组织类加载器之间关系的一种规范,他的工作原理是:如果一个类加载器收到了类加载的请求,它不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,这样层层递进,最终所有的加载请求都被传到最顶层的启动类加载器中,只有当父类加载器无法完成这个加载请求(它的搜索范围内没有找到所需的类)时,才会交给子类加载器去尝试加载.

  这样的好处是:java类随着它的类加载器一起具备了带有优先级的层次关系.这是十分必要的,比如java.langObject,它存放在\jre\lib\rt.jar中,它是所有java类的父类,因此无论哪个类加载都要加载这个类,最终所有的加载请求都汇总到顶层的启动类加载器中,因此Object类会由启动类加载器来加载,所以加载的都是同一个类,如果不使用双亲委派模型,由各个类加载器自行去加载的话,系统中就会出现不止一个Object类,应用程序就会全乱了


评论

《“java 类加载机制及CLassLoader”》 有 1 条评论

  1. :exclaim: :surprised: :confused:

回复 youximao 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注