JAVA 基础之 Class文件详解《未完》

Class文件详解

什么是Class文件

基本概念

  • 能够被JVM识别,加载并执行的文件格式

谁能生成class文件?

  • Java语言
  • Scala语言
  • Python语言
  • 其他语言

其实不止class文件,很多语言都行(最终将class文件交给JVM执行)

如何生成一个class文件

  • 通过IDE自动帮我们build
  • 手动通过javac去生成class文件
  • 通过 java命令去执行class文件

class文件的作用


  • 记录一个类文件的所有信息记住所有!

也就是为什么我们没声明 this super 却可以调用的原因

class文件格式的详解

  • 一种8位字节的二进制流文件
  • 各个数据按顺序紧密的排列,无间隔
  • 每个类、接口、枚举 等 都单独占据一个class文件

class文件结构

class文件中定义了这么多字段,java虚拟机就可以找到每个class文件中的内容

类型 名称 数量 作用
u4(无符号四字节) magic 1 加密段,文件是否被篡改过
u2 minor_verstion 1 最小适配的JDK版本
u2 major_verstion 1 表示当前class是用哪个jdk版本生成的
u2 constant_pool_count 1 当前class常量池数量
cp_info constant_pool constant_pool_count - 1 真正的常量池(结构体类型)
u2 access_flags 1 作用域标志(public private等 四大权限)
u2 this_class 1 java虚拟机生成的时候补充了this字段,用于调用
u2 super_class 1 与上同理
u2 interfaces_count 1 只记录当前类,直接继承的接口(而不会递归)
u2 interfaces interfaces_count
u2 fields_count 1 当前class文件中 所有的成员变量数
field_info fields fields_count 包含每个成员变量的name,类型
u2 methods_count 1 当前方法数量
method_info methods methods_count 方法name,类型,所属的类等
u2 attribute_count 1 类的属性相关的(上面字段没包含的内容,比如注解)
attribute_info attributes attribute_count

access_flags的取值范围

这里写图片描述

constant_pool

简单的类型(不仅仅只有这几种)

  • CONSTANT_Interger_info
  • CONSTANT_Long_info
  • CONSTANT_String_info

复杂一点的

这些只是存储了一些索引
- CONSTANT_Class_info
:类相关的信息,当前类的名字,包括引用到得类的一些信息
- CONSTANT_Fieldref_info
:记录我们当前字节码中得成员变量
- CONSTANT_Methodref_info
: 记录我们当前字节码中得方法

用工具分析

010Editor

链接:https://pan.baidu.com/s/1S7Baniq-CBu_VPOetpyYgg 密码:xaj8

猜你喜欢

转载自blog.csdn.net/qq_30889373/article/details/79947737