一、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. Communication System(动态规划)

    个人心得:百度推荐的简单DP题,自己做了下发现真得水,看了题解发现他们的思维真得比我好太多太多, 这是一段漫长的锻炼路呀. 关于这道题,我最开始用DP的思路,找子状态,发现自己根本就不会找DP状态数组 ...

  2. NAT路由器打洞原理

    什么是打洞,为什么要打洞 由于Internet的快速发展 IPV4地址不够用,不能每个主机分到一个公网IP 所以使用NAT地址转换. 下面是我在网上找到的一副图 一般来说都是由私网内主机(例如上图中“ ...

  3. 一次调用cloudera的的API和JSON想到的

    JSON的null字段 在我的项目中修改了YARN的资源池,到cloudera中就报错,查询还不报错,但是修改的时候,就报错,大致意思就是信息有异常,“包含了尖括号. 因为通过API+json交互,我 ...

  4. 开启 intel vt-d

    1.开机后按“DEL”或“F2”进入BIOS: 2.在Advanced选项页中找到System Agent Configuration并选择进入: 3.进入System Agent Configura ...

  5. POJ3258(最大化最小值)

    River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11155   Accepted: 4785 ...

  6. Python内置函数:strip()

    文章转载于:http://www.cnblogs.com/itdyb/p/5046472.html(博主:波比12) 在python API中这样解释strip()函数:

  7. tomcat 基础知识学习

    1: 直接将web项目文件件拷贝到webapps 目录中,Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用,所以可以将JSP程序打包成一个 wa ...

  8. Rails的静态资源管理(四)—— 生产环境的 Asset Pipeline

    官方文档:http://guides.ruby-china.org/asset_pipeline.html http://guides.rubyonrails.org/asset_pipeline.h ...

  9. unittest添加测试用例方法

    1. suite=unittest.TestLoader().loadTestsFromTestCase(changedTestHJ)unittest.TextTestRunner(verbosity ...

  10. python_class21

    #!/usr/bin/env python # -*- coding: utf-8 -*- """ @version: 3.5 @author: morgana @lic ...