我通过增加新的当地人newLocal
从LocalVariableSorter
。我将本地人添加到的方法是带有长参数的实例方法。我要添加两个本地人。一长一物。示例代码中没有其他本地变量。
结果,我期望以下插槽/索引:
0 - this
1 - the long param
3 - my 1st local added via `newLocal` - using two slots as it is a long
5 - my 2nd local added via `newLocal`
我得到的回报newLocal
是3和7。为什么有这么大的差距?
更让人奇怪的是,当我xSTORE
使用这些索引添加指令并使用javap检查结果时,它向我显示:
LSTORE 5
ASTORE 8
注意:不仅这些值与我传递给xSTORE指令的值不同,而且它们之间的差距现在是3而不是以前的4。
生成的代码虽然有效。我只想了解这里发生了什么 魔术 ,为什么。
谢谢
该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
为创建的变量创建调试信息。
null 结果将是0xFFFFFFFFFFFFFFFF0000(正确,寄存器溢出,但我们只更改2字节) 结果将为0x00000000000000000000(WTF?,寄存器溢出,但结果更改所有8个字节而不是4个字节。为什么是0x00000000000000,而不是0xFFFFFF00000000)
问题内容: 我遇到了来自java.util.Calendar的奇怪行为: 我想知道为什么会这样吗? 问题答案: 问题是您要从2013年1月30日开始使用日历。 然后,您将年份设置为2013年-这不是问题。 然后,您将月份设置为1(即2月)。您希望在这里发生什么?实际发生的情况是,它会记住需要将月份设置为1,而 不是 重新计算实际时间值。根据文档(Emphsis我的), 将 在您调用to时重新计算时
我非常困惑为什么gcc会为const数组上的简单for循环生成这种(看似)非最佳代码。 结果: 我主要关心的是: 为什么无用的第一个元素比较在?这永远不会命中,也永远不会被分支回。它最终只是第一次迭代的重复代码。 < li >有没有更好的方法来编写这个非常简单的循环,这样gcc就不会产生这种奇怪的代码? < li >有没有我可以利用的编译器标志/优化?< code>O3只是展开循环,我也不希望这样
下面的代码是一个小示例,可以轻松重现问题。所以我有 String 类型的变量,它设置了默认值。我有3种方法: getter 塞特 将字符串转换为布尔值的方便方法 自省不会将getter作为readMethod返回,将setter作为WriteMethod返回。相反,它将isTest()方法作为readMethod返回。setter为空。 从文档中我了解到,如果类型是boolean,那么" is "
问题内容: 我正在尝试使用SQL设置分页。我想要每页3个结果,这是我所做的: 我检查了很多次,这不是很复杂,但是我的结果并不是我所期望的: 第1页: 第2页 : 第3页: 第4页: 如您所见,第2、3和4页的结果相同…当我一次取4页时: 结果 : 也许我遗漏了一些东西或排序结果以及使用限制/偏移量不兼容,我不知道出了什么问题。 问题答案: 这里的问题是所有行的命中计数均为,因此使用时它们的位置是不
问题内容: 这是我所有表的结构和查询 (请关注 下面的 最后一个 查询)。正如您在小提琴中看到的那样,这是 当前输出: 没错,一切都很好。 现在,我还有一个名为“类别”的存在。每个帖子只能有一个类别。而且我也想为每个用户获得前两个类别。而这里是我的新的查询。正如您在结果中看到的,发生了一些重复: 看到?,。为什么这些是重复的?我只是增加了一个对,一模一样。但是它不能按预期工作,甚至会影响标签。 无