DexFile类介绍

简介: 继承关系 public final class DexFile extends Object java.lang.Object dalvik.system.DexFile 类概述 操作DEX文件。这个类原理上和ZipFile相似。主要在类装载器里被使用。 注意,我们不直接打开和读取DEX文件。它们被虚拟机以只读方式映射到内存了。 构造函数

继承关系

public final class DexFile extends Object


java.lang.Object
dalvik.system.DexFile


类概述

操作DEX文件。这个类原理上和ZipFile相似。主要在类装载器里被使用。
注意,我们不直接打开和读取DEX文件。它们被虚拟机以只读方式映射到内存了。


构造函数

public DexFile(File file)

通过指定的File对象打开DEX文件。指定的文件通常是一个ZIP/JAR文件,里面包含一个”classes.dex”。虚拟机将在目录/data/dalvik-cache下生成对应的文件名字并打开它,如果系统权限允许的话会首先创建或更新它。不要传目录/data/dalvik-cache下的文件名给它,因为这个文件被认为处于初始状态(DEX被优化之前)。

参数
File 引用实际DEX文件的File对象
异常
IOException 发生I/O异常,例如文件不存在或者没有权限访问。


public DexFile(String fileName)

打开指定文件名的DEX文件。指定的文件通常是一个ZIP/JAR文件,里面包含一个”classes.dex”。虚拟机将在目录/data/dalvik-cache下生成对应的文件名字并打开它,如果系统权限允许的话会首先创建或更新它。不要传目录/data/dalvik-cache下的文件名给它,因为这个文件被认为处于初始状态(DEX被优化之前)。

参数
fileName DEX文件名。
异常
IOException 发生I/O异常,例如文件不存在或者没有权限访问。


公共方法

public void close()
关闭DEX文件。
有可能无法释放任何资源。如果来自DEX文件的类还存活着的话,DEX文件不能被取消映射。
异常
IOException 在关闭文件的过程中可能发生I/O异常,一般不会发生。


public Enumeration<String> entries()
枚举DEX文件里面的类名。
返回值
DEX文件所包含类名的枚举,类名的类型是一般内部格式(像java/lang/String)。


public String getName()
获取(已打开)DEX文件名。
返回值
文件名


public static boolean isDexOptNeeded(String fileName)
如果虚拟机认为apk/jar文件已经过期返回true,并且应该再次通过”dexopt”传递。(译者注:dexopt是apk优化工具)
参数
fileName 被检查apk/jar文件的绝对路径名。
返回值
如果应该调用dexopt处理文件返回true;否则false。
异常
FileNotFoundException 文件不可读、不是一个文件或者文件不存在。
IOException fileName不是有效的apk/jar文件,或者在解析文件时出现问题。
NullPointerException fileName是空的。
StaleDexCacheError 优化过的DEX文件已过期且位于只读分区。


public Class loadClass (String name, ClassLoader loader)
装载一个类。返回成功装载的类,失败返回空。
如果在类装载器之外调用它,往往不会得到你想要的结果,这时请使用forName(String)。

该方法不会在找不到类的时候抛出ClassNotFoundException异常,因为每次在我们看到的第一个DEX文件里找不到类就粗暴地抛出异常是不合理的。

参数
name 类名,应该是一个"java/lang/String"
loader 试图装载类的类装载器(大多数情况下就是该方法的调用者)
返回值
类名对应的对象,装载失败时返回空。


public static DexFile loadDex (String sourcePathName, String outputPathName, int flags)

打开一个DEX文件,并提供一个文件来保存优化过的DEX数据。如果优化过的格式已存在并且是最新的,就直接使用它。如果不是,虚拟机将试图重新创建一个。该方法主要用于应用希望在通常的应用安装机制之外下载和执行DEX文件。不能在应用里直接调用该方法,而应该通过一个类装载器例如dalvik.system.DexClassLoader。

参数
sourcePathName 包含”classes.dex”的Jar或者APK文件。(将来可能会扩展支持"raw DEX"。)
outputPathName 保存优化过的DEX数据的文件。
flags 打开可选功能(目前什么也没定义)
返回值
一个新的,或者先前已经打开的DexFile。
异常
IOException 无法打开输入或输出文件。


受保护方法

protected void finalize ()
类结束时调用。确保DEX文件被关闭。
异常
IOException 关闭文件时发生I/O异常,一般不会发生。


目录
相关文章
|
7月前
|
Java 程序员 编译器
Java继承详解
Java继承详解
|
2月前
|
安全 Java
unsafe类和varhandle类讲解
本文介绍了Java中的Unsafe类和VarHandle类,展示了Unsafe类如何通过底层操作绕过Java的安全限制直接访问内存和对象,以及VarHandle类如何在Java 9及以上版本中提供原子性和可变性访问。
33 1
unsafe类和varhandle类讲解
|
4月前
|
Java 编译器
|
7月前
|
Java API Windows
File 类及其方法
File 类及其方法
55 1
java继承
Java中的抽象类是一种特殊的类,它可以包含抽象方法和普通方法。抽象方法是没有实现的方法,只有声明,没有实现。抽象类不能被实例化,只能被继承。继承抽象类的子类必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。抽象类可以有构造函数,但是不能是public或者protected,只能是private或者protected。抽象类可以有静态方法,也可以有非静态方法。抽象类可以有成员变量,也可以有静态成员变量。抽象类可以被继承,也可以被实现接口。
|
Java
JAVA——File对象的构造方法,成员方法(下)
JAVA——File对象的构造方法,成员方法(下)
77 0
|
Java
JAVA——File对象的构造方法,成员方法(上)
JAVA——File对象的构造方法,成员方法(上)
128 0
|
Java C语言
Java继承——Object
Java继承——Object
177 0
|
Java Android开发
【Android 逆向】类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )
【Android 逆向】类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )
244 0