如何使用ASM中的LDCInsnNode将常量复杂对象加载到堆栈

时间:2015-08-26 14:47:59

标签: bytecode java-bytecode-asm bytecode-manipulation

我想使用ASM库来创建一个能够在运行时返回常量值的字节码方法。我可以使用的ASM中的一个类是LdcInsnNode。所以我的示例代码是:

class Myclass{

final const Object value; 

    @Override
    public MethodNode get(String clsName, String mhName){   

            int access = Opcodes.ACC_PUBLIC| Opcodes.ACC_STATIC;
            MethodNode methodNode = new MethodNode(ASM5, access, mhName, type.toString(), null, null);
            methodNode.instructions.add(new LdcInsnNode(value));
            Type returnType = Type.getReturnType(type.toMethodDescriptorString());
            if(!returnType.getInternalName().equals(Type.getDescriptor(value.getClass))){
                methodNode.instructions.add(new TypeInsnNode(Opcodes.CHECKCAST, returnType.getInternalName()));
            }
            methodNode.instructions.add(new InsnNode(Opcodes.ARETURN));
            return new methodNode;

        }
}

我的问题是当它是复杂类型的实例(用户定义的类)时如何加载值。 LdcInsnNode的文档只说:

  

/ **        *要加载到堆栈中的常量。此参数必须为非null        * {@link Integer},{@link Float},{@ link Long},{@link Double},a        * {@link String}或{@link org.objectweb.asm.Type}。

 public LdcInsnNode(final Object cst) {
        super(Opcodes.LDC);
        this.cst = cst;
    }

1 个答案:

答案 0 :(得分:0)

添加到接受的答案:

最简单的方法可能是将常量类值定义为另一个类的静态字段中的Singleton。这可以是您用Java编写的类,也可以是合成类。然后,当您需要该值时,只需使用getstatic将其放入堆栈即可。