一、java源码编译机制

一个java文件编译为.class文件的流程图。

Parse an Enter阶段:

Parse:将代码字符串转换为token序列(com.sun.tools.javac.parser.Scanner),再将token转换为语法抽象树(com.sun.tools.javac.parser.Parser)

Enter:将符号输入到符号表.内容包括确定超类型和接口,添加类默认构造器

Annotation阶段:

主要处理用户自定义的注解

Analyse and Generate阶段:

Analyse:将语法抽象树进行一系列分析,包括:检查变量使用前是否声明,检查类型匹配,有返回值的方法必须有返回值等等

Generate:生成.class文件(com.sun.tools.javac.jvm.Gen)

生成的class文件包括:

结构信息:class文件格式版本号及各部分数量,大小

元数据:类,父类,接口信息,方法声明,常量池

方法信息:对应java源码中语句、表达式部分

 二、类加载机制

1.Load(装载):

找到二进制字节码并加载到JVM中

2.Link(链接):

VerifyàPrepareàResolve

校验阶段:

校验二进制字节码格式,初始化装载类中的静态变量及解析类中调用的接口、类

如果格式不符合,会抛出VerifyError异常;校验过程中碰到要引用其他的接口和类,也要进行加载;如果加载失败,抛出NoClassDefFoundError一样

Prepare准备阶段

完成校验后,JVM初始化类中的静态变量,并赋予默认值

最后,对类中的所有属性、方法进行验证,保证对应的属性、方法存在,否则抛出NoSuchMethodError、NoSuchFiledError

3.Intialize(初始化):

要想初始化,必须通过校验及准备阶段

初始化就是执行类的static初始化代码、构造器代码、static属性的初始化。初始化被触发的几种情况:

|-调用new

|-反射调用类中的方法

|-之类调用了初始化

|-JVM启动过程中指定的初始化类

ClassLoader方面的常见异常

ClassNotFoundException:

很常见的异常,加载的类不在Classpath中就会抛出此异常。对于自定义的类加载器(继承ClassLoader),需要查看这个ClassLoader加载类的过程来分析类的加载路径

NoClassDefFoundError:

public class A{

public B b = new B();

}

类A引用类B,若B不存在或ClassLoader没法加载B,则抛出此异常

3.LinkageError

重复加载类造成的异常,自定义ClassLoader情况下容易出现,因为此类已经在ClassLoader加载过了

4.ClassCastException

类型转换异常,较容易查找,比较难的是两个类A对象被不同的ClassLoader加载所引发的异常

Java代码执行机制的更多相关文章

  1. Java虚拟机JVM内存分区及代码执行机制

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt230 1.  JVM体系结构 图1 JVM体系结构    方法区:存放JVM ...

  2. 第一章 Java代码执行流程

    说明:本文主要参考自<分布式Java应用:基础与实践> 1.Java代码执行流程 第一步:*.java-->*.class(编译期) 第二步:从*.class文件将其中的内容加载到内 ...

  3. Java 代码执行流程

    Java 代码执行流程 类加载过程 加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载 类加载时机:代码使用到这个类时 验证阶段 &qu ...

  4. 【Hadoop离线基础总结】通过Java代码执行Shell命令

    通过Java代码执行Shell命令 需求 在实际工作中,总会有些时候需要我们通过java代码通过远程连接去linux服务器上面执行一些shell命令,包括一些集群的状态管理,执行任务,集群的可视化界面 ...

  5. 使用java代码执行linux命令

    前提: java代码是在windows下面写的,要打包放到linux下面运行,并且执行某个脚本. java代码: try { // 起作用的代码其实就下面这一行, 参数是linux中要执行的代码 Ru ...

  6. JS代码执行机制

    JS代码从编译到执行 我们写出一段JS代码,JS的引擎并不是按照我们书写的顺序从上到下顺序编译并且执行的,首先是按照自己的规则对我们的代码先进行编译,然后从上到下执行编译的代码. 在全局作用域中,JS ...

  7. Java代码执行过程概述

    Java代码经历三个阶段:源代码阶段(Source) -> 类加载阶段(ClassLoader) -> 运行时阶段(Runtime) 首先我们来理清一下Java代码整个执行过程, 让我们对 ...

  8. java 代码执行cmd 返回值异常 (关于JAVA Project.waitfor()返回值是1)

    关于JAVA Project.waitfor()返回值是1   0条评论 Project.waitfor()返回值是1,找了很久从网上没有发现关于1的说明. 这时对源代码调试了一下,发现Project ...

  9. Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序

    //据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...

随机推荐

  1. 使用swing构建一个界面(包含flow ,Border,Grid,card ,scroll布局)

    package UI; import java.awt.BorderLayout;import java.awt.CardLayout;import java.awt.Cursor;import ja ...

  2. python+rabbitmq实现分布式

    #master # -*- coding: utf-8 -*-import sys#reload(sys)sys.setdefaultencoding("utf-8") impor ...

  3. VerilogHDL编译预处理

    编译预处理语句 编译预处理是VerilogHDL编译系统的一个组成部分,指编译系统会对一些特殊命令进行预处理,然后将预处理结果和源程序一起在进行通常的编译处理.以”`” (反引号)开始的某些标识符是编 ...

  4. 蓝桥杯 算法训练 ALGO-139 s01串

    算法训练 s01串 时间限制:1.0s 内存限制:256.0MB 问题描述  s01串初始为”0”  按以下方式变换  0变1,1变01 输入格式  1个整数(0~19) 输出格式  n次变换后s01 ...

  5. [转载]centos下yum安装samba及配置

    centos下yum安装samba及配置 在我们使用 Windows 作为客户机的时候,通常有文件.打印共享的需求.作为Windows 网络功能之一,通常可以在 Windows 客户机之间通过Wind ...

  6. 机器学习:SVM(scikit-learn 中的 RBF、RBF 中的超参数 γ)

    一.高斯核函数.高斯函数 μ:期望值,均值,样本平均数:(决定告诉函数中心轴的位置:x = μ) σ2:方差:(度量随机样本和平均值之间的偏离程度:, 为总体方差,  为变量,  为总体均值,  为总 ...

  7. Celery-4.1 用户指南: Calling Tasks(调用任务)

    基础 本文档描述 Celery 中任务实例和 Canvas 使用的统一 “Calling API”. API 中定义了一个执行选项的标准集,以及三个方法: - apply_async(args[, k ...

  8. Python unittest excel数据驱动 写入

    之前写过一篇关于获取excel数据进行迭代的方法,今天补充上写入的方法.由于我用的是Python3,不兼容xlutils,所以无法使用copy excel的方式来写入.这里使用xlwt3创建excel ...

  9. Windows条件变量

    详细见MSDN:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686903%28v=vs.85%29.aspx 我们已经看到,当想 ...

  10. Linux 对mysql远程授权连接操作 和 查看mysql数据库和表 基本命令

    Linux 对mysql远程连接的授权操作 首先linux连接mysql数据库 授权: grant all on *.* to ' with grant option; //允许账户root从任何主机 ...