【问题标题】:"throws" and "annotation for exception" in Dalvik bytecodeDalvik 字节码中的“抛出”和“异常注释”
【发布时间】:2012-12-27 23:01:36
【问题描述】:

为什么生成字节码为

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

而不是.throws Ljava/io/FileNotFoundException

如果一个方法在java代码的头部声明throws FileNotFoundException

【问题讨论】:

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


    【解决方案1】:

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

    答案稍长:

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

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

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

    【讨论】:

    • 我明白你的意思。在回复您的回复时,我可以添加的更多上下文是: 1. 是的,我需要编译时间信息,以了解可能引发异常的方法,而不是我自己硬编码。 2. dex文件是从apk-tool中解压出来的。然后我使用 dedexer(dedexer.sourceforge.net) 来获取类的 jasmin 格式。我只是检查它的源代码(在JasminStyleCodeGenerator.java中的方法addMethodAnnotation中,它确实同时处理throws和注释,但输出只是显示总是输出方法注释而不是@987654326 @.
    • fwiw,使用 baksmali 可能会更好。虽然我显然有点偏见:)。但是 baksmali 与 throws 注释具有基本相同的行为(它将其显示为注释)。
    【解决方案2】:

    dalvik.annotation.Throws 出现在方法上

    一个 Throws 注释附加到每个声明为抛出一个或多个的方法 异常类型。

    this page 的底部。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多