我正在创建一个java框架,以便在Invoke dynamic的帮助下转换bean。我用ASM创建转换类。为了生成如下所示的转换:
target.setter( convert(source.getter()) );
我用ASM编写以下字节码:
mv.visitVarInsn(ALOAD, ARGUMENT_2);
mv.visitVarInsn(ALOAD, ARGUMENT_1);
mv.visitMethodInsn(INVOKEVIRTUAL, sourceClass, sourceGetter.getName(), Type.getMethodDescriptor(sourceGetter), false);
mv.visitInvokeDynamicInsn("convert", Type.getMethodDescriptor(Type.getType(targetSetter.getParameterTypes()[0]), Type.getType(sourceGetter.getReturnType())), converterBootstrapMethod);
mv.visitMethodInsn(INVOKEVIRTUAL, targetClass, targetSetter.getName(), Type.getMethodDescriptor(targetSetter), false);
然后,convert方法会搜索可以处理给定类型的转换器。这看起来像:
public static CallSite bootstrap(final MethodHandles.Lookup caller, final String name, final MethodType type) throws Exception {
final Class<?> sourceType = type.parameterType(0);
final Class<?> targetType = type.returnType();
MethodHandle converter = findConverter(sourceType, targetType);
return new ConstantCallSite( converter.asType(type) );
}
这适用于String to Integer转换。但不适用于仿制药。
sourceType仅为Ljava/util/List;
,而不是完整的Ljava/util/List<Ljava/lang/String;>;
如何在此引导方法中获取完整类型?
答案 0 :(得分:0)
如果您控制调用动态调用站点,则可以向其传递其他参数。在这些参数中,您需要将实际的字段/ getter名称及其声明类传递给调用点。
在引导程序方法中使用此信息,您现在可以找到实际的字段/ getter,并通过反射API提取通用信息。