java - 使用 ASM 插入 FrameNode

标签 java bytecode java-bytecode-asm

我如何将那个 framenode 插入到字节码中?

FRAME FULL [java/lang/String [C java/lang/String T I I [C] []

我的第一个尝试是:

mn.instructions.insertBefore(random, new FrameNode(Opcodes.F_FULL, 1 /**IDK**/,
    new Object[]{ "java/lang/String", "[C", "java/lang/String", "T", "I", "I", "[C]" },
    1/**IDK**/, new Object[] { "[C]","[]" }));

效果不佳。输出:

    FRAME FULL [[java/lang/String] [java/lang/String]

最佳答案

栈帧由一些局部变量和操作数栈上的一些值组成。您要重现的内容显然是将该状态转换为形式为人类可读字符串的结果

FRAME FULL [<em>list of local variables types</em>] [<em>list of operand stack time types</em>]

您要做的第一件事是从输出格式中识别括号,这需要理解包含的类型签名,作为以左括号开头的签名,如 [C表示数组类型,即字符数组。换句话说,一些左括号是类型签名的一部分,其他是输出格式的一部分,而右括号始终是输出格式的一部分,从不出现在类型签名中。

然后,当您确定了两组中的类型签名后,提供适当的局部变量和操作数堆栈项计数。在你的情况下你有:

FRAME FULL // frame type
[          // start local variables
  java/lang/String
  [C
  java/lang/String
  T
  I
  I
  [C
] // seven local variables specified
[ // start of operand stack
] // empty operand stack

但随后您必须开始考虑类型项的含义,不幸的是,它无法从打印输出中推导出来,仅仅重现相同的打印输出并不一定意味着正确的代码。

即项目 TI可以引用具有完整限定名称的类 TI ,分别在这种情况下传递 "T""I"FrameNode会是正确的。然而,它们更可能指的是非类堆栈帧类型 ‹top›int必须使用预定义的 Integer 来引用它ASM 中的常量:

new FrameNode(Opcodes.F_FULL, 7, new Object[] {
    "java/lang/String", "[C", "java/lang/String",
    Opcodes.TOP, Opcodes.INTEGER, Opcodes.INTEGER, "[C" }, 0, new Object[0]);

关于java - 使用 ASM 插入 FrameNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36939802/

相关文章:

java - 在 JBoss 中使用 MOXy 创建 JAXBContext 时出现 StackOverflow 错误

java - 编译后 Java 对象引用变量类型会发生什么变化?

java - 跟踪类字节码中方法实现的变化

java - 没有类型信息的 JVM 调用接口(interface)

java.lang.VerifyError : Bad local variable type after bytecode instrumentation 错误

java - 我想从 ListView 中选择用户名文本字段并使用该用户名删除 mysql 数据库中存在的数据

java - 使用 "\t"(选项卡)打印不会导致列对齐

java - 在 Spring Boot 中,继承的 ServletRequestAttributes 在子线程完成之前被标记为完成

java - 确定是否使用最后一个参数

java - JVM 字节码浮点否定 : not allowed but possible?