Я хочу использовать библиотеку 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}, * {@link String} или {@link org.objectweb. .asm.Тип}.
public LdcInsnNode(final Object cst) {
super(Opcodes.LDC);
this.cst = cst;
}