栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

ASM-使用来自LocalVariableSorter的newLocal的奇怪localVar索引

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ASM-使用来自LocalVariableSorter的newLocal的奇怪localVar索引

LocalVariableSorter
班有一个设计,这使得它非常容易出错使用它。

当调用由

MethodVisitor
API
定义的方法时,它们将进行类文档中提到的重新编号。
因此,当与一起使用时
ClassReader
,所访问的旧代码将被转换。由于您不希望注入的新代码进行此转换,而是使用新定义的变量,因此必须绕过
LocalVariableSorter
基础target上的and调用方法
MethodVisitor


当你打电话

visitVarInsn(LSTORE,3)
LocalVariableSorter
,它就会像一个老指令引用索引处理
3
因为你注入了新的变量占用的索引
3
4
索引,“老变量”
3
被重新映射到一个空闲的索引,这是
5
(和
6
)。然后,当你定义你的下一个新的变量,它得到指数
7
,并呼吁
visitVarInsn(ASTORE,7)
LocalVariableSorter
是像一个老变量处理与您的新的变量冲突,因此它被重新映射到
8

此行为与类文档的第一句话完全匹配:

LocalVariablesSorter

一个MethodVisitor,它按出现顺序对局部变量重新编号。

所以,当你要调用

newLocal
LocalVariableSorter
创建将不会被重新映射一个新的变量,你必须调用
visit…
原始方法,包
MethodVisitor
使用它。使用子类时
GeneratorAdapter
,可以使用其新定义的方法(不是以开头的方法
visit…
)来创建不会被转换的新指令,但是对我来说,如果拥有用于转换指令和创建未转换指令的方法,情况将变得更糟。在同一个类上,并且始终需要记住
visit…
前缀会有所不同。对于某些方法,您仍然需要访问原始方法访问者,如本答案中所讨论的,该访问者处理
visitLocalVariable
为创建的变量创建调试信息。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/454931.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号