title: java类加载系列之---类编译揭秘

date: 2018-07-17 11:48:02

category: 原创

tags: [Java,Java类编译加载执行专题]

本文为java类编译加载执行系列文章第一篇:类编译揭秘

第一步:我们写一个java源文件,如下:

public class CompileTest {

public static void main(String[] args) {

User user = new User(1, "Vale");

System.out.println(user.getUserName());

}

}

public class User {

private int userId;

private String userName;

public User(int userId, String userName) {

super();

this.userId = userId;

this.userName = userName;

}

}//省略getter setter

第二步(编译): 创建完源文件之后,程序会先被编译为.class文件。Java编译一个类时,如果这个类所依赖的类还没有被编译,编译器就会先编译这个被依赖的类,然后引用,否则直接引用,这个有点象make。如果java编译器在指定目录下找不到该类所其依赖的类的.class文件或者.java源文件的话,编译器话报“cant find symbol”的错误。class文件包括以下几个部分:魔数、副版本号、主版本,常量池,方法字节码。

编译后的字节码文件格式主要分为两部分:常量池和方法字节码。常量池记录的是代码出现过的所有token(类名,成员变量名等等)以及符号引用(方法引用,成员变量引用等等);方法字节码放的是类中各个方法的字节码。下面是CompileTest .class通过反汇编的结果,我们可以清楚看到.class文件的结构:

第三步(运行):java类运行的过程大概可分为两个过程:1、类的加载 2、类的执行。需要说明的是:JVM主要在程序第一次主动使用类的时候,才会去加载该类。也就是说,JVM并不是在一开始就把一个程序就所有的类都加载到内存中,而是到不得不用的时候才把它加载进来,而且只加载一次。

下面是程序运行的详细步骤:

在编译好java程序得到CompileTest .class文件后,在命令行上敲java CompileTest 。系统就会启动一个jvm进程,jvm进程从classpath路径中找到一个名为CompileTest .class的二进制文件,将CompileTest 的类信息加载到运行时数据区的方法区内,这个过程叫做CompileTest 类的加载。

然后JVM找到CompileTest 的主函数入口,开始执行main函数。

main函数的第一条命令是User user = new User(1, "Vale");;就是让JVM创建一个User对象,但是这时候方法区中没有User类的信息,所以JVM马上加载User类,把User类的类型信息放到方法区中。

加载完User类之后,Java虚拟机做的第一件事情就是在堆区中为一个新的User实例分配内存, 然后调用构造函数初始化User实例,这个User实例持有着指向方法区的User类的类型信息(其中包含有方法表,java动态绑定的底层实现)的引用。

当使用user.getUserName()的时候,JVM根据user引用找到User对象,然后根据User对象持有的引用定位到方法区中User类的类型信息的方法表,获得getUserName()函数的字节码的地址。

开始运行getUserName()函数。

java类编译_java类编译过程相关推荐

  1. java 类编译_Java类编译、加载、和执行机制

    Java类编译.加载.和执行机制 标签: java 类加载 类编译 类执行 机制 0.前言 个人认为,对于JVM的理解,主要是两大方面内容: Java类的编译.加载和执行. JVM的内存管理和垃圾回收 ...

  2. java 执行机制_Java类的执行机制

    在完成将class文件信息加载到JVM并产生Class对象后,就可执行Class对象的静态方法或实例化对象进行调用了.在源码编译阶段将源码编译为JVM字节码,JVM字节码是一种中间代码的方式,要由JV ...

  3. java初始化实例化_Java 类初始化和实例化以及多态理解

    前言 本篇主要讲解了类的初始化.实例化.静态代码块.构造器.getClass().super.this 等相关的知识点,做一个总结. demo 老规矩,看代码: Father.java public ...

  4. java 类文件_Java类文件概述

    所谓 Java 类文件,就是通常用 javac 编译器产生的 .class 文件.这些文件具有严格定义的格式. Java 源文件经过 javac 编译器编译之后,将会生成对应的二进制文件(如下图所示) ...

  5. java语言编译_java在线编译-编译,java

    本教程分享:<java在线编译>, java在线编译网站或工具有哪些? 你做了很多了吧!很好,继续学吧! class.forName():加载的是指定的一个类 .class文件是由JAVA ...

  6. java 属性 方法_Java类的属性与方法

    <Java类的属性与方法>由会员分享,可在线阅读,更多相关<Java类的属性与方法(24页珍藏版)>请在人人文库网上搜索. 1.教师: 班级:,第11讲 类的方法,回顾,1.成 ...

  7. java 类定义_JAVA类与对象(二)----类定义基础

    类是组成java程序的基本要素,是java中的一种重要的复合数据类型.它封装了一类对象的状态和方法,是这一类对象的原型.一个类的实现包括两个部分:类声明和类体,基本格式: class { 属性 方法 ...

  8. java 匿名 异常_JAVA类(内部类、匿名内部类、异常、自定义异常)

    内部类 package AA;public class类 {int de=123; StringBuffer dee=newStringBuffer();public class成员内部类{publi ...

  9. java类结构工具_java类层次结构图工具

    Java主类结构_计算机软件及应用_IT/计算机_专业资料.Java主类结构 谢谢大家! Java主类结构 谢谢大家! +申请认证 文档贡献者 胸兢谙韶硛蠌 中西医 59981 ...... 知识结构 ...

最新文章

  1. python画切片图_python|Python图片常用操作-索引与切片
  2. 面试 排序 java_面试 12:玩转 Java 快速排序
  3. php设计分布图,MySQL分表实现上百万上千万记录分布存储的批量查询设计模式[图]_MySQL...
  4. Python小游戏(打地鼠)
  5. 7.1使用Request获取HTTP请求头
  6. USACO Section1.5 Superprime Rib 解题报告
  7. 关于眼保健操中的轮刮眼眶
  8. U盘装XP系统(含截图,2012最新原创超简单方法)
  9. 第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法等)和Job(创建、关联等)
  10. 将来不当科学家,今天不必做科研?
  11. 非局部均值(Nonlocal-Mean)
  12. java正式测试数据隔离,开发环境要不要和测试环境隔离?
  13. swift 笔记 (十三) —— 继承
  14. 12-Python3 元组
  15. python取数组最后一个元素_python数组最后一个元素
  16. 处理数字音乐文件用计算机软件,处理数字音乐文件用计算机软件商标
  17. 一周搜索热点20170528
  18. Windows 系统自带的文件同步工具
  19. dsp版win10和普通版区别_Windows10各个版本有什么不同,如何选择适合自己的Win10系统...
  20. 基础拓扑学笔记(1)——欧拉定理

热门文章

  1. 在linux命令行 下学习编写java
  2. polycom安卓手机客户端_安卓新功能曝光:或可通过应用商店更新手机系统
  3. agv ti 毫米波雷达_激光雷达VS毫米波雷达 谁才是自动驾驶“头号玩家”?
  4. android xml 指纹动画,如何检查设备是否具有指纹功能并在Android中使用
  5. 【OpenYurt 深度解析】边缘网关缓存能力的优雅实现
  6. Serverless X OpenKruise 部署效率优化之道
  7. SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(可灰度)
  8. 普通java跑到linux上,JAVA在linux下open too many files
  9. python取列表前几个元素_Python 获取list(列表)前n个不重复元素
  10. 怎么将excel中的url批量转化为图片_阿里云+Power BI,轻松实现图片可视化报告(一)...