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