我在 ASM 框架的帮助下创建 Java 字节码检测工具,需要确定并可能更改方法的局部变量的类型。很快我遇到了一个简单的情况,其中变量和堆栈映射节点看起来有些奇怪,并且没有提供有关正在使用的变量的足够信息:
public static void test() {
List l = new ArrayList();
for (Object i : l) {
int a = (int)i;
}
}
Run Code Online (Sandbox Code Playgroud)
给出以下字节码(来自 Idea):
public static test()V
L0
LINENUMBER 42 L0
NEW java/util/ArrayList
DUP
INVOKESPECIAL java/util/ArrayList.<init> ()V
ASTORE 0
L1
LINENUMBER 43 L1
ALOAD 0
INVOKEINTERFACE java/util/List.iterator ()Ljava/util/Iterator;
ASTORE 1
L2
FRAME APPEND [java/util/List java/util/Iterator]
ALOAD 1
INVOKEINTERFACE java/util/Iterator.hasNext ()Z
IFEQ L3
ALOAD 1
INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object;
ASTORE 2
L4
LINENUMBER 44 L4
ALOAD 2 …Run Code Online (Sandbox Code Playgroud)