首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用invokedynamic时的泛型信息

使用invokedynamic时的泛型信息
EN

Stack Overflow用户
提问于 2016-07-01 23:26:21
回答 1查看 79关注 0票数 1

我正在创建一个java框架来在Invoke dynamic的帮助下转换bean。我用ASM创建了转换类。为了生成如下所示的转换:

代码语言:javascript
复制
target.setter( convert(source.getter()) );

我用ASM编写了以下字节码:

代码语言:javascript
复制
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方法搜索可以处理给定类型的转换器。这看起来像这样:

代码语言:javascript
复制
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) );
}

这对于字符串到整数的转换很有效。但不适用于泛型。sourceType仅为Ljava/util/List;,而不是完整的Ljava/util/List<Ljava/lang/String;>;

如何在这个bootstrap方法中获得完整的类型?

EN

回答 1

Stack Overflow用户

发布于 2016-07-02 16:14:24

如果您控制了调用动态调用站点,则可以向其传递额外的参数。在这些参数中,您需要将实际的字段/getter名称及其声明类传递给调用站点。

使用bootstrap方法中的这些信息,您现在可以定位实际的字段/getter,并通过反射API提取通用信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38149020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档