ASM:查找泛型类型的描述符

Gel*_*Luo 1 java java-bytecode-asm

我正在创建一个基于 ASM 的实用程序来动态生成类。我需要做的一件事是生成一个具有泛型类型作为参数的方法签名。例如

public void setValue(List<String> value) {...}
Run Code Online (Sandbox Code Playgroud)

问题是如何获得List<String>使用 ASM 库的描述符。我知道有一个实用方法asm.Type.getDescriptor(Class),我想知道有没有类似的方法getDescriptor(java.lang.reflect.Type),或者我该如何实现?

谢谢...绿色

Raf*_*ter 5

您正在寻找签名,而不是描述符。描述符总是指原始类型。

对于 ASM,您通常会为此目的使用aSignatureVisitor。对于您的示例,您可以void : List<String>通过以下方式创建签名:

SignatureVisitor sv = new SignatureWriter();
SignatureVisitor psv = sv.visitParameterType();
psv.visitClassType(Type.getInternalName(List.class));
SignatureVisitor ppsv = psv.visitTypeArgument('=');
ppsv.visitClassType(Type.getInternalName(String.class));
psv.visitEnd();
SignatureVisitor rtv = sv.visitReturnType();
rtv.visitBaseType('V');
String signature = sv.toString();
Run Code Online (Sandbox Code Playgroud)

由于调用的条件要求,签名访问者 API 与其他访问者 API 一样直观,visitEnd但阅读 javadoc 可以了解其含义。