2016-10-22 4 views
1

私はASMに基づいて、その場でクラスを生成するためのユーティリティを作成しています。私が必要とするのは、ジェネリック型をパラメータとして持つメソッドシグネチャを生成することです。例えば。ASM:ジェネリック型のディスクリプタを見つけよう

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

質問は、私がASMライブラリを使用してList<String>の記述を得ることができる方法です。ユーティリティメソッドasm.Type.getDescriptor(Class)があることは知っていますが、​​のようなものがありますか、それともどのように実装できますか?ちょうどここに、これを必要とする人のためのグリーン

+0

あなたの記述子には、単にlistを使用します。このシグネチャは、ジェネリックを実装するために変更するものです。 –

答えて

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が原因visitEndを呼び出すことが、javadocの意味を学ぶことができますを読んだの条件付き要件に他の訪問者のAPIのように直感的です。

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); 
} 
関連する問題