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

Nfff3:

我只想检测带有注释的方法@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(),但这是在某处指定的还是仅仅是实现细节?

rzwitserloot:

它是..有效指定的,我猜呢?

关键是,按照Java虚拟机规范关于类文件格式的部分在类文件格式中,注释一定要排在第一位。

ASM可以不遗余力地读取所有这些批注,缓存该信息,继续访问方法定义的代码部分,然后返回并将缓存的信息反馈给您的ASM节点访问者。

ASM的开发团队还可以拿出锤子,用锤子砸自己的脸。

听起来都一样明智。

问题是,因为在类文件排序IS规定,我认为这是那些地方,即使ASM规范没有正式说出来,你可以睡得香甜知道这将永远是真正的一个(或至少,只要类文件按该顺序执行即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

“最终”是否总是在Python中执行?

mocha before()中的异步函数总是在it()规范之前完成吗?

在python中,总是在方法中首先调用super()。是否存在以后应调用的情况?

AssertCalled总是在testify库中失败

查询相同的ID时,存储库是否应该总是在内存中返回相同的引用?

是否总是在主线程上调用SKProductsRequestDelegate方法?

是否总是在Javascript中定义了称为“名称”的变量?

是否调用.click(); 总是在返回之前调用所有事件处理程序?

为什么总是在mouseDoubleClickEvent之前调用mousePressEvent

为什么几乎总是在类中Set之前先编写Get,这是有原因的吗?

列表理解是否总是在Python中创建列表?

文档头中的脚本是否总是在DOMContentLoaded触发之前执行?

在.net中,总是在出现Text Button LostFocus事件之前引发Button Click事件?

在调用asm函数之前是否在C中调用printf的神秘副作用?

总是在渲染之前调用componentWillRecieveProps还是以其他方式调用

React-Native总是在组件中调用SwitchNavigator

是否总是在调度程序调用之后进行时间中断?

Node.js:节点是否总是在退出之前等待setTimeout()完成?

二进制搜索丢失的元素是否总是在元素存在之前就返回该元素?

AngularJS指令-控制器是否总是在链接功能运行之前被实例化?

NSOperationQueue是否总是在取消分配之前完成其队列?

总是在numpy中的对象中的每个条目之前添加每个值。插

BroadcastReceiver 的 onReceive 方法是否总是在动态注册时调用?

是否总是在 startActivity 之前安排完成?

当前目录是否总是在gdb的搜索路径中

DAO 类中的 get 方法(对于 OneToMany)是否总是进行数据库调用?

initState() 方法中的异步函数调用是否总是在 Flutter 中的 build() 方法之后调用?

dataURL 图像是否总是在 JavaScript 模块之前加载?

为什么总是在 blazor 中调用“HandleValidSubmit()”