Java的编译、运行

来源:互联网 发布:诺基亚java下载专区 编辑:程序博客网 时间:2024/05/29 03:05

概述

  1. 编译:
    源文件由编译器编译成字节码文件,即.class文件;class文件是一种二进制文件,能够运行在java虚拟机(jvm)中。编译后的字节码文件主要分为两部分:常量池方法字节码。常量池中记录的是类名、成员变量名和一些引用;方法字节码中存放的是类中各个方法的字节码。
  2. 执行
    当需要用到一个类时,jvm便将该类经过编译后的.class文件加载到内存中,然后,找到其main函数(主函数入口)开始执行。

类的加载过程

JVM将类的加载过程分为三个步骤:装载(Load)、链接(Link)、初始化(Initialize)。其中,链接又分为验证、准备、解析。

  • 装载:查找并加载类的二进制数据。
  • 链接:
    1. 验证:确保被加载类的正确性。
    2. 准备:为类的静态变量分配内存,并将其初始化为默认值。
    3. 解析:把类中的符号引用转换为直接引用。
  • 初始化:调用类的构造函数进行初始化。

需注意:
1. 验证是为了防止他人写.class文件对程序造成伤害。
2. 在没有初始化之前,已经为静态变量分配了内存,并且赋予其默认值。

类的初始化

类在什么时候会被初始化呢?
1. 创建类的实例,也就是new一个对象
2. 访问某个类或接口的静态变量,或者对该静态变量赋值
3. 调用类的静态方法
4. 反射(Class.forName())
5. 初始化一个类的子类(会首先初始化子类的父类)
6. JVM启动时标明的启动类,即文件名和类名相同的那个类

需注意:
1. 只有在这六种情况下,才会初始化一个类。
2. 调用Class.forName()时会初始化一个类,本文将着重介绍java的反射机制。

类加载器

类加载器简介

JVM有三种预定义类型类加载器:
启动类加载器(BootStarp):引导类装入器是用本地代码实现的类装入器,它负责将 /lib 下面的类库加载到内存中。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。
标准扩展类加载器(Extension) :扩展类加载器是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader) 实现的。它负责将 < Java_Runtime_Home >/lib/ext 或者由系统变量 java.ext.dir 指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器。
系统类加载器(System):系统类加载器是由 Sun 的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。

类加载双亲委托机制介绍与分析

通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。

类加载器继承关系测试

关于类加载器的继承关系,下图是一张在其他资料上找来的图片。
这里写图片描述

测试代码:

public static void main(String[] args){        System.out.println(ClassLoader.getSystemClassLoader());        System.out.println(ClassLoader.getSystemClassLoader().getParent());        System.out.println(ClassLoader.getSystemClassLoader().getParent().getParent());}

输出结果:

sun.misc.Launcher$AppClassLoader@2a788b76sun.misc.Launcher$ExtClassLoader@500c05c2null

说明:
1. 通过java.lang.ClassLoader.getSystemClassLoader()可以直接获取到系统类加载器。
2. 此处仅证明了系统类加载器的父类加载器是标准扩展类加载器,至于为什么标准扩展类加载器的父类是启动类加载器,此处没有证明,具体可打开参考资料里面的链接进行查看。

参考资料

  • http://www.360doc.com/content/14/0218/23/9440338_353675002.shtml
  • http://blog.csdn.net/gjanyanlig/article/details/6818655
  • http://www.blogjava.net/zhuxing/archive/2008/08/08/220841.html
0 0