乗算用の LDC 命令を変換する MethodVisitor を作成したいと考えています。
バイトコードの例:
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);
}
}
}
これは私が持っているものですが、定数プールの古い値は削除されず、バグがある可能性があります。