실행되는 각 함수 내에 콜백 함수를 삽입하기 위해 asm을 사용하고 있습니다. 어떻게 arguents 값을 인쇄 할 수 있습니까?바이트 코드 인스턴스 작성을 위해 java asm을 사용하여 함수 인수 값을 가져옴
MethodAdapter.visitCode를 사용하여 내 기능을 각 기능에 주입했습니다.
나는 배열로 함수 인수를 삽입하고 내 callbackk 기능이 배열을 보내고 함수가 다음 코드는에 메소드 인수를 삽입 그들
를 계속 사용할 수 있도록 스택에 다시 인수를 반환 할 배열에 저장되고 콜백 함수에 Object 배열로 전송됩니다. 내가 for 루프 전에 원래의 기능
@Override public void visitCode()
{
int paramLength = paramTypes.length;
System.out.println(className + "." + methodName + ": paramLength = " + paramLength);
// Create array with length equal to number of parameters
mv.visitIntInsn(Opcodes.BIPUSH, paramLength);
mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/Object");
mv.visitVarInsn(Opcodes.ASTORE, paramLength);
// Fill the created array with method parameters
int i = 0;
for (Type tp : paramTypes)
{
System.out.println("tp.getClassName() = " + tp.getClassName());
mv.visitVarInsn(Opcodes.ALOAD, paramLength);
mv.visitIntInsn(Opcodes.BIPUSH, i);
if (tp.equals(Type.BOOLEAN_TYPE))
{
mv.visitVarInsn(Opcodes.ILOAD, i);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;");
}
else if (tp.equals(Type.BYTE_TYPE))
{
mv.visitVarInsn(Opcodes.ILOAD, i);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;");
}
else if (tp.equals(Type.CHAR_TYPE))
{
mv.visitVarInsn(Opcodes.ILOAD, i);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Character", "valueOf", "(C)Ljava/lang/Character;");
}
else if (tp.equals(Type.SHORT_TYPE))
{
mv.visitVarInsn(Opcodes.ILOAD, i);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Short", "valueOf", "(S)Ljava/lang/Short;");
}
else if (tp.equals(Type.INT_TYPE))
{
mv.visitVarInsn(Opcodes.ILOAD, i);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;");
}
else if (tp.equals(Type.LONG_TYPE))
{
mv.visitVarInsn(Opcodes.LLOAD, i);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;");
i++;
}
else if (tp.equals(Type.FLOAT_TYPE))
{
mv.visitVarInsn(Opcodes.FLOAD, i);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Float", "valueOf", "(F)Ljava/lang/Float;");
}
else if (tp.equals(Type.DOUBLE_TYPE))
{
mv.visitVarInsn(Opcodes.DLOAD, i);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;");
i++;
}
else
mv.visitVarInsn(Opcodes.ALOAD, i);
mv.visitInsn(Opcodes.AASTORE);
i++;
}
//System.out.println("end for");
// Load class name and method name
this.visitLdcInsn(className);
this.visitLdcInsn(methodName);
// Load the array of parameters that we created
this.visitVarInsn(Opcodes.ALOAD, i);
this.visitMethodInsn(Opcodes.INVOKESTATIC, "callbackpackage/CallBack", "callbackfunc", "(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V");
super.visitCode();
}
가에 관한 자세한 정보를 제공 할 것 당신은 논쟁하고 싶습니다. 당신은 논쟁을 인쇄 할 계획이십니까? 아니면 단순히이 인수의 값을 다른 함수로 보내겠습니까? – vijay
이 값을 다른 함수, 아마도 배열로 보내려고합니다. – Shay