2012-09-27 4 views
2

메소드 매개 변수에 주석을 추가해야합니다. 방법은 이전과 같은와 Javassist 만들어집니다 : 메소드 생성에 주석을 writtingJavassist로 만든 새 메소드의 매개 변수에 주석 추가

@Target(ElementType.PARAMETER) 
@Retention(RetentionPolicy.RUNTIME) 

public @interface Param { 
    /** Name of the parameter */ 
    String name() default ""; 
} 

1)

javassist.CannotCompileException: [source error] syntax error near "myMethod(@Param 

를 던졌습니다 :

CtClass cc2 = pool.makeClass("Dummy"); 
CtMethod method = CtNewMethod.make("public java.lang.String dummyMethod(java.lang.String oneparam){ return null; }", cc2); 

내가 추가 할 주석은 매우 간단합니다 2)이 발견 solution하지만 내 경우에 null을 반환하는 라인을 기반으로 :

AttributeInfo paramAtrributeInfo = methodInfo.getAttribute(ParameterAnnotationsAttribute.visibleTag); // or inVisibleTag 

나는 이것을 수행하는 방법을 놓치고있다. 누구나 새로운 메소드를 만들고 매개 변수에 주석을 추가 할 수있는 방법을 찾았습니까? 사전에

감사합니다.

답변

0

원래 질문에서 언급 한 해결책을 바탕으로 해결 방법을 찾았습니다. 클래스를 생성하고 거기에 메소드를 추가하고 javassist를 사용하여 해당 매개 변수에 주석을 삽입 할 수 없습니다. 그러나 실제 클래스를 템플릿으로 사용하여 매개 변수 주석을 찾아 편집 할 수 있습니다.

1) 첫째,

ClassPool pool = ClassPool.getDefault(); 
CtClass liveClass = null; 
try { 
    liveClass = pool.get("your.package.path.Dummyclass"); 
} catch (NotFoundException e) { 
    logger.error("Template class not found.", e); 
} 

3)가

// -- Get method template 
    CtMethod dummyMethod = liveClass.getMethods()[2]; 
    // -- Get the annotation 
    AttributeInfo parameterAttributeInfo = dummyMethod.getMethodInfo().getAttribute(ParameterAnnotationsAttribute.visibleTag); 
    ConstPool parameterConstPool = parameterAttributeInfo.getConstPool(); 
    ParameterAnnotationsAttribute parameterAtrribute = ((ParameterAnnotationsAttribute) parameterAttributeInfo); 
    Annotation[][] paramArrays = parameterAtrribute.getAnnotations(); 
    Annotation[] addAnno = paramArrays[0]; 
    //-- Edit the annotation adding values 
    addAnno[0].addMemberValue("value", new StringMemberValue("This is the value of the annotation", parameterConstPool)); 
    addAnno[0].addMemberValue("required", new BooleanMemberValue(Boolean.TRUE, parameterConstPool)); 
    paramArrays[0] = addAnno; 
    parameterAtrribute.setAnnotations(paramArrays); 

이어서 변경 작업

public class TemplateClass { 
    public String templateMethod(@Param String paramOne) { 
     return null; 
    } 
} 

2) 부하 원하는 어노테이션하는 방법으로 클래스를 생성 결과 클래스를 작성하기 전에 CtClass 및/또는 CtMethod의 이름. 예상대로 유연하지는 않지만 적어도 일부 시나리오는 이와 같은 접근 방식으로 해결할 수 있습니다. 다른 해결 방법은 환영합니다!