gpt4 book ai didi

java - ASM : getting local variable name and value inside a method of a class

转载 作者:行者123 更新时间:2023-12-02 11:19:16 24 4
gpt4 key购买 nike

我想使用 ASM 提取类方法中存在的局部变量名称和值。请提供建议。

最佳答案

在 Java 字节码中,局部变量集中到局部列表中,该列表将包含在方法参数的开头(包括接收者 - 对 this 的引用)。然后,当声明局部变量时,接下来分配它们。最后,如果不再使用局部变量或参数,则该空间将被“释放”,以便可以再次用于另一个变量。

局部变量名和它们在局部变量列表中的位置之间的关系可以从 MethodVisitor#visitLocalVariable(...) 中获得。或来自LocalVariableNode (仅当类是使用调试信息编译时)。

仅通过 ASM 查看字节码无法获得局部变量值,您必须添加指令以在所需的点打印局部变量的值。一个选项是检测存储指令并插入指令以记录它们之前的值。

示例(假设所有变量都是 int,对于其他类型需要调用 log 的重载版本)。

// In a AdviceAdapter
private static final Type VAR_LOGGER = Type.getInternalName(VarLogger.class);
private static final Method LOG_I = Method.getMethod("void log(int, int)");
private static final Method LOG_L = Method.getMethod("void log(long, int)");
private static final Method LOG_F = Method.getMethod("void log(float, int)");
private static final Method LOG_D = Method.getMethod("void log(double, int)");
private static final Method LOG_A = Method.getMethod("void log(Object, int)");

@Override
public void visitVarInsn(int opcode, int var) {
if (isStoreOp(opcode)) {
dup();
push(var);
invokeStatic(VAR_LOGGER, getLogMethod(opcode));
}
super.visitVarInsn(opcode, var);
}

private boolean isStoreOp(int opcode) {
switch (opcode) {
case ISTORE:
case LSTORE:
case FSTORE:
case DSTORE:
case ASTORE:
return true;
default:
return false;
}
}

private Method getLogMethod(int opcode) {
switch (opcode) {
case ISTORE: return LOG_I;
case LSTORE: return LOG_L;
case FSTORE: return LOG_F;
case DSTORE: return LOG_D;
case ASTORE: return LOG_A;
default:
throw new RuntimeException("Invalid store code: " + opcode);
}
}

@Override
public void visitMaxs(int maxStack, int maxLocals) {
super.visitMaxs(maxStack + 3, maxLocals);
}

注意:仅当您不使用 COMPUTE_MAXS 时才需要覆盖 visitMaxs

关于java - ASM : getting local variable name and value inside a method of a class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50051393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com