好长的一段时间,对于类的生命周期十分模糊,现在经过一段时间的学习,对于类的生命周期的理解已经变得清晰,类的生命周期如下所示:
类的装载就是通过类加载器把.class二进制文件转入jvm的方法区,并在堆区创建描述该类的java.lang.Class对象,用来封装数据。如果要获取这个Class对象可以通过实例的getClass()或者直接通过的类的静态方法.class。JVM规范允许预先加载,在预料到某个类要使用的时候就加载这个类,如果这个类不存在,也不会马上抛出异常,只有在程序主动使用这个类的时候才会抛出异常,如果这个类一直没有使用,那么就永远不会抛出异常。
对于验证是验证加载的二进制文件是否符合规范,如有没有继承final类等。
准备就是为静态成员分配内存空间,并设置默认值,byte short long flloat 都是0,对象类型为null,boolean类型为false.
解析就是对于编译型常量使用直接的内存地址代替变量,如final static int a = 10;但是对于在编译的时候不能得到具体值得变量不做变换,如final static int a = Math.random()。在完成上述工作后,就是对于静态变量的初始化。
对于静态变量的初始化时在主动使用的时候才会初始化他们。以下6种情况是主动使用
创建类的实例,途经包括:使用new 创建对象实例,clone等
使用反射方法
使用静态方法
使用类或者接口的静态变量,给静态变量赋值
创建子类
把类声明为启动类,如: java Test01
这时候会初始化类的静态变量,执行静态代码块
我想主要说一下类的卸载:只有没有任何引用指向Class对象的时候,这时候才会卸载类,结束类的生命周期。在JVM中有三类加载器 根加载器,扩展加载器,系统加载器,JVM始终保持这几类加载器的引用,加载器会把其加载的类放在一个集合中,这样就保留着对于Class对象的引用(不可以操作JVM的加载器),所以由JVM的加载器加载的类是不会卸载的,如果要验证一个类是否可以卸载,可以自己创建一个类加载器(继承ClassLoader) Loader,加在一个类Test,然后让loader的实例赋值为null,loader加载的Class对象也赋值为null;再次创建Loader的实例,并加载Test,这时候可以打印这两个Test的Class对象的哈希值(是不一样的),如一下代码(加载器MyclassLoader.java不给出了):
java 代码
- public class MainTest01
- {
-
- public static void main(String[] args)
- {
- MyClassLoader loader = new MyClassLoader();
- Class clazz = loader.findClass("Test");
- System.out.println(clazz.hashCode());
- loader = null;
- clazz = null;
- loader = new MyClassLoader();
- clazz =loader.findClass("Test");
- System.out.println(clazz.hashCode());
- }
-
- }
如果注释掉第9句,那么会抛出类重复加载异常。
分享到:
相关推荐
Java中类的生命周期.doc
Java多线程生命周期的讲解,很详细,希望能帮到大家
主要介绍了通过代码实例解析JAVA类生命周期,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java中类的生命周期与java垃圾回收机制
Java中对象的生命周期 自己总结 Java中对象的生命周期 private构造方法
java对象的生命周期,讲得很详细,很好的东东哦
提供了访问该类在方法去内的数据结构的接口。...Java虚拟机自带的类加载器包括:启动类加载器,扩展类加载器,系统类加载器三种。 用户自定义的类加载器是ClassLoader类的实例,通过它来定制类的加载方式。
本文详细讲述了一个java类自调入内存至被卸载的整个声明周期,对理解对象的生命周期,jvm中的类加载等内容有所帮助。
详解java类的生命周期.doc
java变量的生命周期与作用域ppt 很详细的资源
Java线程生命周期
Web编程(Java )-Servlet的生命周期
Java Servlet的原理与生命周期 CGI的工作过程
最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做...
Java WEB 篇七 Servlet 生命周期
类(型)的生命周期--装载、连接、初始化、卸载 帮助你正确理解类的产生与消亡
spring bean 的生命周期,把运行结果的日志,用sublime打开对比查看,你会有比较清晰的认识
而java类的生命周期是其字节码文件装载、连接、初始化、使用、和卸载的整个过程。 ● 装载。 jvm找到需要装载的类,将类的信息装载到jvm的方法区中。然后在堆区实例化一个java.lang.Class对象,作为方法...
Java多线程(二)、线程的生命周期和状态控制