Java代码执行机制
一、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代码执行机制的更多相关文章
- Java虚拟机JVM内存分区及代码执行机制
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt230 1. JVM体系结构 图1 JVM体系结构 方法区:存放JVM ...
- 第一章 Java代码执行流程
说明:本文主要参考自<分布式Java应用:基础与实践> 1.Java代码执行流程 第一步:*.java-->*.class(编译期) 第二步:从*.class文件将其中的内容加载到内 ...
- Java 代码执行流程
Java 代码执行流程 类加载过程 加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载 类加载时机:代码使用到这个类时 验证阶段 &qu ...
- 【Hadoop离线基础总结】通过Java代码执行Shell命令
通过Java代码执行Shell命令 需求 在实际工作中,总会有些时候需要我们通过java代码通过远程连接去linux服务器上面执行一些shell命令,包括一些集群的状态管理,执行任务,集群的可视化界面 ...
- 使用java代码执行linux命令
前提: java代码是在windows下面写的,要打包放到linux下面运行,并且执行某个脚本. java代码: try { // 起作用的代码其实就下面这一行, 参数是linux中要执行的代码 Ru ...
- JS代码执行机制
JS代码从编译到执行 我们写出一段JS代码,JS的引擎并不是按照我们书写的顺序从上到下顺序编译并且执行的,首先是按照自己的规则对我们的代码先进行编译,然后从上到下执行编译的代码. 在全局作用域中,JS ...
- Java代码执行过程概述
Java代码经历三个阶段:源代码阶段(Source) -> 类加载阶段(ClassLoader) -> 运行时阶段(Runtime) 首先我们来理清一下Java代码整个执行过程, 让我们对 ...
- java 代码执行cmd 返回值异常 (关于JAVA Project.waitfor()返回值是1)
关于JAVA Project.waitfor()返回值是1 0条评论 Project.waitfor()返回值是1,找了很久从网上没有发现关于1的说明. 这时对源代码调试了一下,发现Project ...
- Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序
//据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...
随机推荐
- Thinkphp 自定义404页面
一. 手册->调试->异常处理 在公共config.php 中加入: 'TMPL_EXCEPTION_FILE' => '/Public/404.html', //访问不存在的跳转 ...
- PHP开发中的问题
1.echo不输出值,有可能是该值不存在. 2.PHP+MySQL上一条下一条记录查询 id作为自增int SQL语句如下即可:上一条 SELECT * FROM A WHERE id < $i ...
- NAT路由器打洞原理
什么是打洞,为什么要打洞 由于Internet的快速发展 IPV4地址不够用,不能每个主机分到一个公网IP 所以使用NAT地址转换. 下面是我在网上找到的一副图 一般来说都是由私网内主机(例如上图中“ ...
- PHP根据两点间的经纬度计算距离,php两点经纬度计算(转)
这是一个不错的示例,直接贴代码,首先要知道纬度值.经度值 /** * @desc 根据两点间的经纬度计算距离 * @param float $lat 纬度值 * @param float $lng 经 ...
- snmpwalk用法
snmpwalk语法:snmpwalk 交换机或路由器IP地址 -c SNMP读密码 -v 1或2(代表SNMP版本) OID(对象标示符) 用法举例:1.snmpwalk -c public -v ...
- [MySQL-MM] 生产环境自动恢复MM中一台M2库的过程,分享从零开始写的自动化重建脚本以及思路 (转)
必须是MM架构,而且一台主库M1是完好无损的,一台主库M2可以根据M1主库来进行重建:如果MS架构,自己可以稍微做一下脚本修改动作,也能使用,架构如下图所示: 3 总体思路,建立主脚本a_build ...
- SSL与TLS的区别
SSL(Secure Socket Layer 安全套接层)是基于HTTPS下的一个协议加密层,最初是由网景公司(Netscape)研发,后被IETF(The Internet Engineering ...
- java代码继承------多层继承
总结:继承.方法的重要性, 运行结果显示: class A is callingclass B is callingclass C is calling package com.addd; //jav ...
- vector向量容器元素排序与查找
1.利用标准库函数sort()对vector进行排序 参考源码: #include <algorithm> #include <vector> vector<int> ...
- 关于java中getClass()和getSuperClass()的讲解
为了讲解这个问题,我们先来看一下下面的代码: package com.yonyou.test; import java.util.Date; class Test extends Date{ priv ...