Java应用程序的开发周期包括编译,在一个类编译完成之后,下一步就需要开始使用类,如果要使用一个类,肯定离不开JVM。在程序执行中JVM通过装载,链接,初始化这3个步骤完成。
1、 编译
开发人员编写的是Java源代码文件(。java),IDE会负责调用Java的编译器把Java源代码编译成平台无关的字节代码(byte code),以类文件的形式保存在磁盘上(。class)。Java虚拟机(JVM)会负责把Java字节代码加载并执行。Java通过这种方式来实现其 “编写一次,到处运行(Write once, run anywhere)” 的目标。Java类文件中包含的字节代码可以被不同平台上的JVM所使用。Java字节代码不仅可以以文件形式存在于磁盘上,也可以通过网络方式来下载,还可以只存在于内存中。JVM中的类加载器会负责从包含字节代码的字节数组(byte[])中定义出Java类。在某些情况下,可能会需要动态的生成 Java字节代码,或是对已有的Java字节代码进行修改。
2、装载
类的装载是通过类加载器完成的,加载器将。class文件的二进制文件装入JVM的方法区,并且在堆区创建描述这个类的java.lang.Class对象。
创建自己的类加载器
在Java 应用开发过程中,可能会需要创建应用自己的类加载器。典型的场景包括实现特定的Java 字节代码查找方式、对字节代码进行加密/解密以及实现同名 Java 类的隔离等。创建自己的类加载器并不是一件复杂的事情, 只需要继承自java.lang.ClassLoader 类并覆写对应的方法即可。
3、链接
Java类的链接指的是将Java类的二进制代码合并到JVM的运行状态之中的过程。在链接之前,这个类必须被成功加载。类的链接包括验证、准备和解析等几个步骤。验证是用来确保Java类的二进制表示在结构上是完全正确的。
(1)如果验证过程出现错误的话,会抛出java.lang.VerifyError错误。准备过程则是创建Java类中的静态域,并将这些域的值设为默认值。
(2)准备过程并不会执行代码。在一个Java类中会包含对其它类或接口的形式引用,包括它的父类、所实现的接口、方法的形式参数和返回值的Java类等。
(3)解析的过程就是确保这些被引用的类能被正确的找到。解析的过程可能会导致其它的 Java类被加载。
4、初始化
以上三步完成之后,类型也就完成了初始化,初始化之后类的对象就可以正常使用了。当一个Java 类第一次被真正使用到的时候,JVM 会进行该类的初始化操作。初始化过程的主要操作是执行静态代码块和初始化静态域。在一个类被初始化之前,它的直接父类也需要被初始化。但是,一个接口的初始化,不会引起其父接口的初始化。在初始化的时候,会按照源代码中从上到下的顺序依次执行静态代码块和初始化静态域。
转自http://www.hh010.com/developer/html/42-2/2229.htm
分享到:
相关推荐
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多线程(二)、线程的生命周期和状态控制