ASM:如何根据类型轻松获得正确的操作码

时间:2013-02-20 09:57:57

标签: java bytecode java-bytecode-asm

我正在使用ASM生成Java字节码。我需要创建一个动态代理,它可以基本上覆盖任何类型的方法和额外的后处理。我能够做到这一切,但有一件事我看不出怎样做得很好。

我覆盖的方法的第一个参数的类型可以是任何内容,因此我无法在ASM代码中使用ALOAD,但我可能需要使用ILOAD,{{1 },LLOAD等 我的问题:基于我想加载的参数类型,有没有办法轻松知道哪个LOAD指令操作码是有效的,所以我不必做类似的事情:

FLOAD

1 个答案:

答案 0 :(得分:2)

假设parameterType类型为Class或类型String包含类型描述符(如"I""Ljava/lang/String;"),则:

import org.objectweb.asm.Type;

...

Type parameterAsmType = Type.getType(parameterType);
int opcode = parameterAsmType.getOpcode(Opcodes.ILOAD);
mv.visitVarInsn(opcode, 1);

与其他操作码类似。有关详细信息,请参阅Type.getOpcode() javadoc