android - Dalvik 字节码中的 "throws"和 "annotation for exception"

标签 android dalvik java-bytecode-asm jvm-bytecode jasmin

为什么字节码生成为

 .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/io/FileNotFoundException;
        }
 .end annotation

而不是 .throws Ljava/io/FileNotFoundException

如果方法在 java 代码的 header 中声明throws FileNotFoundException

最佳答案

简短的回答是,dex 格式中没有特定的“throws”概念。当 java 类文件转换为 dex 格式时,会添加包含此信息的 Throws 注释。

稍微长一点的答案:

检查异常的概念只在编译时起作用,在运行时无关紧要。 dalvik 虚拟机不知道也不关心你的方法会抛出什么异常。就其而言,一切都是未经检查的异常。 Java 编译器强制在您的 throws 子句中声明已检查的异常。

因此,在 dex 文件中添加特定的“throws”概念是没有意义的。相反,该信息是使用更通用的注释功能存储的。

听起来您正在使用类似 dex2jar 的东西将 dex 文件转换回一组类文件,然后在其上使用 jasmin。 dex2jar 可能不会将 dex 文件中的 Throws 注释重新映射回 Exception attribute在类文件中,虽然我没有具体检查是否是这种情况。

关于android - Dalvik 字节码中的 "throws"和 "annotation for exception",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14062434/

相关文章:

java - 使用ASM创建方法

android - 仅重绘 Android View 中的一部分

Android 应用程序安装失败,错误为 : [INSTALL_FAILED_DEXOPT]

安卓 : How can I know how much memory is allocated on VM for my app?

android - Android 设备的时间会跳跃吗?

java - 使用 java 和 ASM 访问 InnerClassNode 的方法

java - JMockit:模拟的 api 会在一段时间后恢复

java - Android 监听器是某种设计模式吗?

android - 将聊天气泡对准RecyclerView的左侧

java - AOSP 添加新的自定义系统服务