我想编写一个 MethodVisitor 来转换用于乘法的 LDC 指令。
示例字节码:
ldc #26
imul
这基本上推动了一个常数,然后将其相乘。
它必须是有状态的转换,因为我首先必须检查它是否用于乘法,如果是,我需要返回到 ldc 指令并修改常量。我不完全确定该怎么做,也不知道如何修改常量(当我尝试传递不同的值时,旧值仍保留在常量池中)。
编辑:
public class AdditionTransformer extends MethodAdapter {
boolean replace = false;
int operand = 0;
AdditionTransformer(MethodVisitor mv) {
super(mv);
}
@Override
public void visitInsn(int opcode) {
if (opcode == IMUL && replace) {
operand *= 2;
visitLdcInsn(operand);
replace = false;
}
mv.visitInsn(opcode);
}
@Override
public void visitLdcInsn(Object cst) {
if (cst instanceof Integer && !replace) {
operand = (Integer) cst;
replace = true;
} else {
mv.visitLdcInsn(cst);
}
}
}
这就是我所拥有的,但它不会删除常量池中的旧值,并且可能存在错误。