class和dex

class文件

概念:可以被JVM识别加载并执行的文件格式。java,scala,kotlin,python,ruby都可以生成class文件

怎么生成class文件:
(1)通过我们的IDE ,build生成
(2)通过javac命令生成
怎么执行class文件
(1)通过IDE中的run执行
(2)通过java命令执行

class文件的作用:记录一个类文件的所有信息

class文件的结构:

  • 一种8位字节的二进制刘文建
  • 各个数据按顺序紧密排列无间隙,减少了文件的体积,加快了加载的速度
  • 每个类或者接口都单独占据一个class文件,每个类单独管理没有交叉。
类型名称数量描述
U4magic1加密段
U2minor_version1最小适配的jdk版本
U2major_version1编译使用的jdk版本
U2constant_pool_count1常量池的数量
cp_infoconstant_poolconstant_pool_count-1常量池的结构体,常量池
U2access_flags1访问级别,作用域public,private …
U2this_class1当前类
U2super_class1父类
U2interfaces_count1类实现接口的数量
U2interfacesinterfaces_count当前类直接继承的接口,不包括父类的
U2fields_count1类成员变量的数量
field_infofieldsfields_count成员变量
U2methods_count1类方法的数量
method_infomethodsmethods_count类方法的结构体,方法的名字类型等
U2attributes_count1类属性的数量
attribute_infoattributesattributes_count类属性的结构体,比如注解等

access_flags的取值范围

标志名标志值标志含义针对的对象
ACC_PUBLIC0X0001public类型所有类型
ACC_FINAL0X0010final类型
ACC_SUPER0X0020使用新的invokespecial语义类和接口
ACC_INTERFACE0X0200接口类型接口
ACC_ABSTRACT0X0400抽象类型类和接口
ACC_SYNTHETIC0X1000该类不由用户代码生成左右类型
ACC_ANNOTATION0X2000注解类型注解
ACC_ENUM0X4000枚举类型枚举

constant_pool包含:

CONSTANT_Integer_info
CONSTANT_Long_info
CONSTANT_String_info

分别存储类中的int ,long ,String等类型的数据
CONSTANT_Class_info : 类相关信息 ,只保存索引
CONSTANT_Fieldref_info :成员变量相关信息,只保存索引
CONSTANT_Methodref_info:方法相关信息,只保存索引

下面来看一个class文件的内容,在android studio中

public class Hello {
    public static void main(String[] args){
       System.out.print("hello");
    }
}

然后编译就能生成hello的class文件
位置在app\build\intermediates\javac\debug\compileDebugJavaWithJavac\classes\com\cxt\hello
使用010Editor(可百度下载安装)打开hello.class文件
在这里插入图片描述
上图中我们就可以看到前面说的那些字段,点击就可以看到每个字段的信息,起始位置,长度大小等

class文件的弊端

内存占用大,不适合移动端
独占加载模式,加载速度慢
文件IO操作多,类查找慢

dex文件

概念:dex是能够被DVM(Dalvik虚拟机 ART虚拟机)识别,并加载的文件格式
dex中包含了app的所有的源码

dex文件生成:
(1)IDE通过build生成
(2)通过dex命令生成

dex记录了整个工程中所有类文件的信息

结构:

  • 一种8位字节的二进制流文件
  • 个呢过暑假按顺序紧密排列无间隙
  • 整个引用中所有的java源文件都放在一个dex中

文件头:head (文件头)
索引区:string_ids(字符串索引),type_ids(类型索引),proto_ids(方法原型索引),field_ids(域的索引),method_ids(方法的索引)
数据区:class_defs(类的定义区),data(数据区),link_data(链接数据区,so文件)

header部分

字段名称偏移值长度说明
magic0X08dex魔数字段固定信息“dex\n035\0”
checksum0X84校验码
signature0XC20sha-1签名
file_size0X204dex文件总长度
header_size0X244文件头的长度
endian_tag0X284标示字节顺序常量
link_size0X2C4连接字段的大小,如果是0就是静态连接
link_off0X304连接字段开始的位置
map_off0X344map数据基址
string_ids_size0X384字符串列表中字符串的个数
string_ids_off0X3C4字符串表基址
type_ids_size0X404类列表里类型的个数
type_ids_off0X444类列表基址
proto_ids_size0X484原型列表中原型的个数
proto_ids_off0X4C4原型列表的基址
field_ids_size0X504字段个数
field_ids_off0X544字段列表基址
method_ids_size0X584方法个数
methon_ids_off0X5C4方法列表基址
class_defs_size0X644类定义标中类的个数
class_defs_off0X604类定义列表基址
data_size0X684数据段的大小
data_off0X6C4数据段基址

索引区和数据区都可以通过010Edito0r查看到。还是上面那个Hello工程
dex文件位置:app\build\intermediates\dex\debug\mergeDexDebug\out
使用010Editor打开此文件下的classes.dex文件
在这里插入图片描述
上图就可以看到头部信息,索引区,数据区的信息。

class文件和dex文件对比

  • dex是从class文件演变而来
  • class文件对应java中每一个类,dex文件的头文件与索引区部分,保存了所有类及类中数据的索引,因此,dvm可通过这两部分快速查找到对应类及数据
  • class文件存在许多冗余信息,dex会出去冗余并整合,更适合移动端。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值