小编noo*_*oop的帖子

为什么 Java 编译器会生成奇怪的局部变量和堆栈映射帧,以及如何使用它们来可靠地确定变量类型?

我在 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)

java jvm bytecode stack-frame

4
推荐指数
1
解决办法
760
查看次数

标签 统计

bytecode ×1

java ×1

jvm ×1

stack-frame ×1