微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在ASM库中,是否总是在visitCode之前调用visitAnnotation?

如何解决在ASM库中,是否总是在visitCode之前调用visitAnnotation?

我只想检测用@Test注释的方法,因此在调用visitCode()之前,我想知道它是否用@Test注释。从我进行的测试中,我可以说visitAnnotation()总是被首先调用,但是我不知道是否总是这样,还是有例外。

更新:来自ASM的代码

这是visitAnnotation()名称

if (runtimeVisibleAnnotationsOffset != 0) {
    attributeLength = this.readUnsignedShort(runtimeVisibleAnnotationsOffset);

    for (currentAnnotationOffset = runtimeVisibleAnnotationsOffset + 2; attributeLength-- > 0;
     currentAnnotationOffset = this.readElementValues(methodVisitor.visitAnnotation(annotationDescriptor,true),currentAnnotationOffset,true,charBuffer)) {
        annotationDescriptor = this.readUTF8(currentAnnotationOffset,charBuffer);
        currentAnnotationOffset += 2;
    }
}
...
...

然后,它调用visitCode()

 if (codeOffset != 0) {
     methodVisitor.visitCode();
     this.readCode(methodVisitor,context,codeOffset);
  }

因此,很显然,首先调用了visitAnnotation(),但这是在某处指定的还是仅仅是实现细节?

解决方法

ASM javadoc指定所有方法调用的顺序,是的,按合同规定,可以保证此顺序,在visitCode之前调用visitAnnotation。如果您使用官方的ASM发射器(例如ClassReader),则顺序将始终遵循规范。

但是类型系统中没有内置订单保证。任何人都可以实现不同的顺序,并且某些消费者(例如ClassWriter)可以容忍这种偏差,即使并不总是明确保证也是如此。


(由kriegaex更新)如果您想确定要知道,只需检查一下ASM manual,chapter 3.2.1,其中已明确记录了该内容:

MethodVisitor documentation

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。