Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ASM:如何根据类型轻松获得正确的操作码_Java_Bytecode_Java Bytecode Asm - Fatal编程技术网

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

Java ASM:如何根据类型轻松获得正确的操作码,java,bytecode,java-bytecode-asm,Java,Bytecode,Java Bytecode Asm,我正在使用ASM生成Java字节码。我需要创建一个动态代理,它可以通过额外的后处理覆盖基本上任何类型的方法。我能做到这一切,但有一件事我看不出如何以一种好的方式去做 我覆盖的方法的第一个参数的类型可以是任何类型,因此我不能在ASM代码中使用ALOAD,但我可能需要使用ILOAD,LLOAD,FLOAD等。 我的问题:根据我要加载的参数类型,是否有一种方法可以轻松知道哪个加载指令操作码是有效的,因此我不必执行以下操作: if (parameterType == int.class) mv.

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

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

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

假设
参数类型
类型或
字符串
类型,包含类型描述符(如
“I”
“Ljava/lang/String;”
),则:


其他操作码也是如此。有关详细信息,请参阅。

您试图生成哪种代码?它只是加载参数并立即调用另一个函数吗?事实上,在这个阶段,这是正确的。调用另一个方法,然后调用之后(在同一方法中)的一些回调执行,您可能需要考虑使用ASM提供的Engor适配器类,它包含许多漂亮的帮助器方法,包括一种方法来执行上面所示的方法。
import org.objectweb.asm.Type;

...

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