本章概述:
-class文件结构深入解析
-dex文件结构深入解析
-class与dex文件对比
-基本概念:
class文件就是一种文件格式,被JVM识别。如下图
java、scala、python等语言都可以编译生成class文件,让jvm识别
如何生成class文件:
1、通过IDE自动帮我们build
2、手动通过javac去生成class文件
3、通过java命令去执行class文件
class文件的三个特点:
1、一种8位字节的二进制流文件
2、各个数据按顺序紧密的排列,无间隙
3、每个类或接口都单独占据一个class文件
class文件结构解析:
class文件记录java文件所有的信息(比如方法、变量等等),并且包含的信息远远大于java源文件, 比如类中没有定义 this 、super 关键字,为什么可以直接调用,因为再生成class文件的时候,java虚拟机就已经记录了当前的类this,和父类super
magic字段 :加密字段,比如md5加密,java虚拟机根据此字段判断class文件是否被篡改过,篡改过会用其他的加密手段。
minor-version字段:class文件最小被哪个jdk版本加载
magor-version字段: class文件是被那个jdk版本生成的
constant_pool_count字段: 常量池数量
constant_pool字段: 代表常量池 最核心部分,放在最后讲解
access_flags字段:class文件作用于域标志,class是公共还是私有类型
this_flags和super_flags字段:这就是上面所说,为什么在java文件里面没有定义this、super关键字,单可以直接调用。就是因为java虚拟机在生成class文件的时候填充的这两个字段。
interface_cout 和interface字段: 表面当前class文件继承了多少接口。但是注意它只会记录当前java文件继承接口的个数,父类的不记录
fields_cout 和fields字段 :java文件包含所有的成员变量
methods_count和methods 字段:记录方法的信息,所属的类等
attribute_count和attributes字段 :属性相关的信息
java虚拟机可以找到class文件中任何信息
access_flags作用域 取值范围
constant_pool常量池中包含的内容: 存储类里面所有的 integer、long、String、short等类型;还有类中的信息,右边图片只是存储的一些索引,索引最终指向的还是 左边的常量池,所以最终存储的还是在常量池里面
下面可以下载工具查看一个class文件
以上是对class文件的介绍,下面介绍一下dex文件
dex文件基本概念:
能够被dvm识别,加载并执行的文件格式
如何生成dex文件
1、通过IDE自动帮我们build生成
2、手动通过dx命令去生成dex文件
手动运行dex在手机
dex文件作用
记录整个工程中所有类文件的信息,记住是整个工程
dex文件结构
一种8位字节的二进制流文件
各个数据按顺序紧密的排列,无间隙
整个应用中所有的java源文件都放在一个dex文件中
class文件和dex文件的对比
本质上他们都是一样的,dex是从class文件演变而来的
class文件存在许多有余信息, dex会去除有余,并合并
class文件弊端:
内存占用大,不适合移动端
堆栈的加栈模式,加载速度慢
文件IO操作多,类查找慢
dex的优点是 一个dex文件就存储了所有的.class文件,更加的适合移动端
总结:
如何生成class及dex文件
class文件与dex文件结构组成
dex与class相比它的优势