我想使用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;
}
答案 0 :(得分:0)
添加到接受的答案:
最简单的方法可能是将常量类值定义为另一个类的静态字段中的Singleton。这可以是您用Java编写的类,也可以是合成类。然后,当您需要该值时,只需使用getstatic将其放入堆栈即可。