前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你说那 class 文件里边都是啥

你说那 class 文件里边都是啥

作者头像
星尘的一个朋友
发布2021-01-13 10:53:46
2580
发布2021-01-13 10:53:46
举报

开往虚拟机的车已经出发,关注上车

在这里插入图片描述
在这里插入图片描述

CLASS文件的结构

  1. 魔数
  2. 版本号
  3. 常量池
  4. 字段表集合
  5. 方法表集合
  6. 属性表集合

我相信你一定打开过 class 文件,你看到的也是下面这个样子,不过这里面都是啥?今天我们一起好好看看。

在这里插入图片描述
在这里插入图片描述

属性表

首先属性表是用来补充信息用的,比如他可以继续补充类文件的信息、就是我们上面最后的那一段内容,还有他可以补充字段的信息,补充方法的信息。所以它出现的位置不同,补充的额外信息也会不一样。

下面我们 简单 的了解一下都有哪些 主要 的内容,之所以要简单、要了解主要的,就是因为它保存的额外信息实在太多了。

属性表的结构是由 2 个字节的属性名索引,4 个字节的属性内容长度,和 1 个字节的属性信息组成。

按照属性的类别可以分为:类文件属性、字段表属性、方法表属性

类文件属性

InnerClass

保存主类和内部类的关系

SourceFile

记录生成这个Class文件的源码文件名称

方法表属性

Code

Java 程序方法体里面的代码经过 Javac 编译器处理之后, 最终变为字节码指令存储在Code属性内。并非所有的方法表都必须存在这个属性, 接口或者抽象类中的方法就不存在Code属性 。

code 属性里面还有属性表… (套娃啊),其中包含

  • LineNumberTable 源码和生成的字节码行号映射表
  • LocalVariableTable 栈帧中的变量与源码变量的映射关系
  • ExceptionTable 异常表
Exceptions

Exceptions属性的作用是列举出在throws关键字后面抛出的异常

MethodParameters

定义方法的参数信息

字段表属性

ConstantValue

这个属性用于为字段的静态变量赋值。只有字段声明为 static 时才有效。Javac 编译器在编译的时候,如果遇到 static 和 final 同时修饰的 基本类型或String 类型变量,会直接在 ConstantValue 属性进行字段初始化。也就是我们说的常量。如果没有 final 修饰,或者不是基本类型和 String 类型,则会在类初始化方法执行的时候初始化 <clinit>

通用属性

Deprecated

Deprecated属性用于表示某个类、 字段或者方法被弃用

关于属性表的内容还有很多,我只了解了一些基本常见的,这部分内容在周老师书里还是比较全的。想继续了解的可以在书中 6.3.7 章节找到更多内容。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-01-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开往虚拟机的车已经出发,关注上车
  • CLASS文件的结构
  • 属性表
    • 类文件属性
      • InnerClass
      • SourceFile
    • 方法表属性
      • Code
      • Exceptions
      • MethodParameters
    • 字段表属性
      • ConstantValue
    • 通用属性
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档