所谓 Java 类文件,就是通常用 javac 编译器产生的 .class 文件。这些文件具有严格定义的格式。

Java 源文件经过 javac 编译器编译之后,将会生成对应的二进制文件(如下图所示)。

每个合法的 Java 类文件都具备精确的定义,而正是这种精确的定义,才使得 Java 虚拟机得以正确读取和解释所有的 Java 类文件。

以下是Javac的流程:

Javac流程

Java 类文件是 8 位字节的二进制流。数据项按顺序存储在 class 文件中,相邻的项之间没有间隔,这使得 class 文件变得紧凑,减少存储空间。

在 Java 类文件中包含了许多大小不同的项,由于每一项的结构都有严格规定,这使得 class 文件能够从头到尾被顺利地解析。

下面让我们来看一下 Java 类文件的内部结构,以便对此有个大致的认识。

例如,一个最简单的Hello World程序

public class HelloWorld {

public static void main(String[] args) {

System.out.println("Hello world");

}

}

经过 javac 编译后,得到的类文件大致是:

Java类文件

从上图中可以看到,一个 Java 类文件大致可以归为 10 个项:

Magic - 该项存放了一个 Java 类文件的魔数(magic number)和版本信息。一个 Java 类文件的前 4 个字节被称为它的魔数。每个正确的 Java 类文件都是以 0xCAFEBABE 开头的,这样保证了 Java 虚拟机能很轻松的分辨出 Java 文件和非 Java 文件。

Version - 该项存放了 Java 类文件的版本信息,它对于一个 Java 文件具有重要的意义。因为 Java 技术一直在发展,所以类文件的格式也处在不断变化之中。类文件的版本信息让虚拟机知道如何去读取并处理该类文件。

Constant Pool - 该项存放了类中各种文字字符串、类名、方法名和接口名称、final 变量以及对外部类的引用信息等常量。虚拟机必须为每一个被装载的类维护一个常量池,常量池中存储了相应类型所用到的所有类型、字段和方法的符号引用,因此它在 Java 的动态链接中起到了核心的作用。常量池的大小平均占到了整个类大小的 60% 左右。

Access_flag - 该项指明了该文件中定义的是类还是接口(一个 class 文件中只能有一个类或接口),同时还指名了类或接口的访问标志,如 public,private, abstract 等信息。

This Class - 指向表示该类全限定名称的字符串常量的指针。

Super Class - 指向表示父类全限定名称的字符串常量的指针。

Interfaces - 一个指针数组,存放了该类或父类实现的所有接口名称的字符串常量的指针。以上三项所指向的常量,特别是前两项,在我们用 ASM 从已有类派生新类时一般需要修改:将类名称改为子类名称;将父类改为派生前的类名称;如果有必要,增加新的实现接口。

Fields - 该项对类或接口中声明的字段进行了细致的描述。需要注意的是,fields 列表中仅列出了本类或接口中的字段,并不包括从超类和父接口继承而来的字段。

Methods - 该项对类或接口中声明的方法进行了细致的描述。例如方法的名称、参数和返回值类型等。需要注意的是,methods 列表里仅存放了本类或本接口中的方法,并不包括从超类和父接口继承而来的方法。使用 ASM 进行 AOP 编程,通常是通过调整 Method 中的指令来实现的。

Class attributes - 该项存放了在该文件中类或接口所定义的属性的基本信息。

java 类文件_Java类文件概述相关推荐

  1. java封装dll文件_java类封装成dll

    1,建立测试类,注意英文注释部分,用汉语直接编译会乱码 public classHello {//native method is used for call other language proce ...

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

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

  3. java类编译_java类编译过程

    title: java类加载系列之---类编译揭秘 date: 2018-07-17 11:48:02 category: 原创 tags: [Java,Java类编译加载执行专题] 本文为java类 ...

  4. java中上传文件_Java中文件上传下载 --使用Minio

    Minio模板类: @RequiredArgsConstructor public class MinioTemplate implements InitializingBean { private ...

  5. java action上传文件_java实现文件上传

    在Java中,要实现文件上传,可以有两种方式: 1.通过Servlet类上传 2.通过Struts框架实现上传 这两种方式的根本还是通过Servlet进行IO流的操作. 一.通过Servlet类上传 ...

  6. java class 结构_Java class文件的结构

    Java class文件的结构 class文件是Java源代码编译之后产生的二进制文件,代码中的各个项目严格按照Java的规范组织. class文件以一张表的形式组织代码中的各个部分: 名称 释义 大 ...

  7. java校验文件格式_Java 判断文件是否为文本格式,并获取文件编码格式,读取内容!...

    我们经常会遇到读取文件内容的情况,就需要判断文件是否为文本文件,及文件编码格式,防止无法读取内容或乱码出现情况. 根据文件扩展名判定不太准确,可能会遇到未知扩展名或被修改了扩展名,下面的测试类使用文件 ...

  8. java gzip 解压文件_Java实现文件压缩与解压[zip格式,gzip格式]

    原文:http://www.cnblogs.com/visec479/p/4112881.html#3069573 Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个 ...

  9. java aio复制文件_java复制文件的4种方式及拷贝文件到另一个目录下的实例代码...

    尽管Java提供了一个可以处理文件的IO操作类. 但是没有一个复制文件的方法. 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候. 然而有几种方法可以进行Java文件复制操作,下面列举出 ...

最新文章

  1. 六大“未来式”存储器,谁将脱颖而出?
  2. python 搭建ftp服务器
  3. 【css】报错,错误代码77,CURLE_SSL_CACERT_BADFILE (77)解决方法
  4. 用类氢轨道计算交换积分和Li原子2S谱项能级
  5. feature map 意义_FeatureMap Viewer以及中心化对统计分布变化的影响讨论
  6. mysql 排名_微服务架构下,如何利用Mysql的limit配合orderby进行排名统计
  7. C语言中const的用法
  8. SpringCloud中父子pom的结构和写法
  9. 【Android开发】用户界面设计-开发自定义的View
  10. css初始化_利用CSS变量实现炫酷的悬浮效果
  11. 5月学习总结(Ant-Design,mustache,require.js,grunt)
  12. 7-二进制,十进制,十六进制
  13. 微课|中学生可以这样学Python(例7.4):队列
  14. Agglomerated SSL 1.2.0 发布
  15. K-Fold Cross Validation
  16. OSChina 周三乱弹 —— 万众期待的拉黑功能
  17. Win系统svchost进程流量偷跑,如何永久杜绝?
  18. pyqt5标签中的字设置不同字体_PyQt5 控件字体样式等设置的实现
  19. Android 推流--分辨率、帧率和码率三者之间的关系
  20. (附源码)计算机毕业设计SSM游泳馆管理系统

热门文章

  1. 周鸿祎回应年会特等奖「免裁券」;微信放开 5000 人好友上限;Firefox 72 正式发布| 极客头条...
  2. BAT程序员必备技能调研,你中了几招?
  3. 中国有什么拿得出手的开源软件产品?|原力计划
  4. 欧洲互联网将“死于”版权法?
  5. GitHub:为什么我们最终选择放弃了 jQuery
  6. 谷歌中国 AI 中心要凉?李飞飞否认将离职
  7. Raj Reddy:从印度农村走出来的图灵奖得主
  8. Java面试官:Kafka集群管理
  9. 牛逼!mysql创建库books
  10. 经验分享:java批量读取txt文件入库