2

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

我要覆盖的方法的第一个参数的类型可以是任何类型,因此我不能ALOAD在 ASM 代码中使用,但我可能需要使用ILOAD,LLOADFLOAD。我的问题:基于我要加载的参数类型,是有一种方法可以轻松知道哪个 LOAD 指令操作码有效,因此我不必执行以下操作:

if (parameterType == int.class)
    mv.visitVarInsn(ILOAD, 1);
else if 
    ...
else 
    mv.visitVarInsn(ALOAD, 1);
4

1 回答 1

3

假设parameterType是包含类型描述符(如or )的类型ClassOR ,则: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

于 2013-02-21T15:09:23.907 回答