gpt4 book ai didi

java - 使用invokedynamic时的泛型信息

转载 作者:太空宇宙 更新时间:2023-11-04 12:28:20 24 4
gpt4 key购买 nike

我正在创建一个java框架来借助动态调用来转换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) );
}

这对于字符串到整数的转换来说效果很好。但不适用于泛型。源类型仅为 Ljava/util/List;而不是完整的Ljava/util/List<Ljava/lang/String;>;

如何获取此引导方法中的完整类型?

最佳答案

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

在引导方法中使用此信息,您现在可以找到实际的字段/getter,并通过反射 API 提取通用信息。

关于java - 使用invokedynamic时的泛型信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38149020/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com