2016-10-22 21 views
1

我正在創建一個基於ASM的實用程序來即時生成類。我需要的一件事就是生成一個具有泛型類型作爲參數的方法簽名。例如。ASM:查找通用類型的描述符

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

問題是如何獲得使用ASM庫的List<String>的描述符。我知道有一個實用方法asm.Type.getDescriptor(Class),我不知道是否有什麼像​​,或者我該如何實現?

謝謝......綠色

+0

對於您的描述符,您只需使用列表。該簽名是您爲了實現泛型而修改的內容。 –

回答

2

您正在尋找的簽名,而不是一個描述符。描述符總是引用原始類型。

使用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(); 

簽名遊客API是與其他遊客的API直觀由於調用visitEnd但閱讀的Javadoc允許學習影響的條件要求。

0

奧凱只是有人誰需要這個,這是我implementation

private static String typeDesc(BeanSpec spec) { 
    String root = classDesc(spec.rawType()); 
    List<java.lang.reflect.Type> typeParams = spec.typeParams(); 
    if (typeParams.isEmpty()) { 
     return root; 
    } 
    StringBuilder sb = S.builder("<"); 
    for (java.lang.reflect.Type type : typeParams) { 
     BeanSpec specx = BeanSpec.of(type, null, spec.injector()); 
     sb.append(typeDesc(specx)); 
    } 
    sb.append(">"); 
    FastStr str = FastStr.of(root); 
    str = str.take(str.length() - 1).append(sb.toString()).append(";"); 
    return str.toString(); 
} 

private static String classDesc(Class c) { 
    if (c.isPrimitive()) { 
     c = $.wrapperClassOf(c); 
    } 
    return Type.getDescriptor(c); 
}