class文件结构


成员变量(非静态)的赋值过程:1. 默认初始化 2. 显示初始化/代码块中初始化 3. 构造器中初始化 4. 有了对象后对象。属性或者对象。方法的方式对成员变量进行赋值
属性没有多态、方法才有多态
在这里插入图片描述

1. 常量池集合

用于存放编译时期生成的各种字面量符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

字面量:字符串、声明为 final 的常量值(常量值就是八种基本数据类型)
符号引用:类和接口的全限定名、字段的名称和描述符、方法的名称和描述符

口述:比如说我们定义了一个类,在类中定义了一些属性和方法,那有关这个类、属性、方法在常量池中都可以找到,像类的全限定名啊、方法返回值啊参数啊方法所属的类啊、属性所属的类啊属性名字啊都在常量池中的。像我们用jclasslab解析class文件也都可以看到这些结构的。

补充说明:

虚拟机在加载 Class 文件时才会进行动态链接,也就是说,Class 文件中不会保存各个方法和字段的最终内存布局信息。因此,这些字段和方法的符号引用不经过转换是无法直接被虚拟机使用的。当虚拟机运行时,需要从常量池中获得对应的符号引用,再在类加载过程中的解析阶段将其替换为直接引用,并翻译到具体的内存地址中。

2. 访问标志

这个 Class 是类还是接口;是否定义为 public 类型;是否定义为 abstract 类型

3. 字段表集合

口述:记录了我们在类中声明的属性的信息,包括属性名字、访问权限啊、是否是static修饰啊、是否是final修饰啊这些描述属性的信息。

用于描述接口或类中声明的变量。包括类变量以及实例变量,但是不包括方法内部代码块内部声明的局部变量

4. 方法表集合

口述:方法表集合描述了我们定义在类中的所有方法的描述信息,包括方法名字、访问修饰符、方法的返回值类型啊方法的参数信息啊,以及方法内部的属性的信息啊等等。

  • 每一个 method_info 项都对应着一个类或者接口中的方法信息。比如方法的访问修饰符(public、private 或 protected),方法的返回值类型以及方法的参数信息等。
  • 如果这个方法不是抽象的或者不是 native 的,那么字节码中会体现出来。
  • methods 表只描述当前类或接口中声明的方法不包括从父类或父接口继承的方法。但methods 有可能会出现由编译器自动添加的方法,最典型的便是编译器产生的方法信息(比如:类(接口)初始化方法<clinit>()和实例初始化方法<init>()

5. 属性表集合

比如说 Code 属性就存放了方法里面的具体的代码, LineNumberTable 属性描述了我们写的代码和字节码指令的这种对应关系, LocalVariableTable 属性描述了局部变量的信息。

  • 14
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值