2016-10-22 5 views
1

나는 ASM을 기반으로 유틸리티를 생성하여 즉석에서 클래스를 생성합니다. 내가 필요로하는 것은 매개 변수로 제네릭 형식을 가진 메서드 서명을 생성하는 것입니다. 예 :ASM : 제네릭 타입의 설명자를 찾습니다.

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

문제는 내가 ASM 라이브러리를 사용 List<String>의 설명을 얻을 수있는 방법이다. 나는 유틸리티 메서드 asm.Type.getDescriptor(Class)이 있다는 것을 알고 있습니다. getDescriptor(java.lang.reflect.Type)과 같은 것이 있습니까? 아니면 어떻게 구현할 수 있습니까? 그냥이 필요한 사람에게

+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 인해 visitEnd를 호출하지만, 의미를 배울 수있는 자바 독을 읽는 조건 요구에 다른 방문자 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); 
}