Java的编译、运行
来源:互联网 发布:诺基亚java下载专区 编辑:程序博客网 时间:2024/05/29 03:05
概述
- 编译:
源文件由编译器编译成字节码文件,即.class文件;class文件是一种二进制文件,能够运行在java虚拟机(jvm)中。编译后的字节码文件主要分为两部分:常量池和方法字节码。常量池中记录的是类名、成员变量名和一些引用;方法字节码中存放的是类中各个方法的字节码。 - 执行
当需要用到一个类时,jvm便将该类经过编译后的.class文件加载到内存中,然后,找到其main函数(主函数入口)开始执行。
类的加载过程
JVM将类的加载过程分为三个步骤:装载(Load)、链接(Link)、初始化(Initialize)。其中,链接又分为验证、准备、解析。
- 装载:查找并加载类的二进制数据。
- 链接:
- 验证:确保被加载类的正确性。
- 准备:为类的静态变量分配内存,并将其初始化为默认值。
- 解析:把类中的符号引用转换为直接引用。
- 初始化:调用类的构造函数进行初始化。
需注意:
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
- Java的编译、运行
- JAVA的编译与运行
- Java程序的编译运行
- java的编译和运行
- java中带包的编译运行方法
- ant实现Java的编译和运行
- JAVA 编译运行中错误的解决办法
- java的一次编译到处运行
- java的编译时多态和运行时多态
- java的所谓一次编译,到处运行
- java的所谓一次编译,到处运行
- Java程序编译和运行的过程
- Java类的编译和运行
- Java整个编译以及运行的过程
- Java程序编译和运行的过程
- Java编译与运行的区别
- Java整个编译以及运行的过程
- java编译异常,运行异常的区别
- 图像格式jpg、jpeg、jpe、gif、png、png等有何不同?ps中那种图片格式可以保留图层?
- Java数组之基础(三)
- 图的强连通性:Korasaju算法实现
- Unity的UI文档
- Kafka源码分析之KafkaProducer发送数据send()方法
- Java的编译、运行
- 【LeetCode】76. Minimum Window Substring
- 微积分计算图:反向传播算法
- 纹理特征提取——灰度共生矩阵
- listview使用笔记
- Jersey Rest 异常统一处理机制
- SQL注入
- [算法最优]设计一个有getMin功能的栈
- const与define之间的区别?