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

public void setValue(List<String> value) {...}


问题是如何使用ASM库获取List<String>的描述符。我知道有一个实用程序方法asm.Type.getDescriptor(Class),我想知道是否有类似getDescriptor(java.lang.reflect.Type)的东西,或者我怎么实现呢?

谢谢...绿色

最佳答案

您在寻找签名,而不是描述符。描述符始终引用原始类型。

使用ASM,通常将a SignatureVisitor用于此目的。对于您的示例,可以通过以下方式为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();


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

关于java - ASM:查找通用类型的描述符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40188380/

10-14 11:02