Estoy usando Javassist para generar una clase foo, con el método bar, pero me parece que no puede encontrar una manera de agregar una anotación (la anotación en sí no es generado en tiempo de ejecución) para el método. El código que he probado parece a esto:

ClassPool pool = ClassPool.getDefault();

//create the class
CtClass cc = pool.makeClass("foo");

//create the method
CtMethod mthd = CtNewMethod.make("public Integer getInteger() { return null; }", cc);
cc.addMethod(mthd);

ClassFile ccFile = cc.getClassFile();
ConstPool constpool = ccFile.getConstPool();

//create the annotation
AnnotationsAttribute attr = new AnnotationsAttribute(constpool, AnnotationsAttribute.visibleTag);
Annotation annot = new Annotation("MyAnnotation", constpool);
annot.addMemberValue("value", new IntegerMemberValue(ccFile.getConstPool(), 0));
attr.addAnnotation(annot);
ccFile.addAttribute(attr);

//generate the class
clazz = cc.toClass();

//length is zero
java.lang.annotation.Annotation[] annots = clazz.getAnnotations();

Y obviamente estoy haciendo algo mal ya que annots es un conjunto vacío.

Esta es la forma en que la anotación se parece a:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    int value();
}
InformationsquelleAutor Idan K | 2010-06-03

1 Comentario

  1. 26

    Resuelto finalmente, se me fue la adición de la anotación en el lugar equivocado. Quería añadir que el método, pero yo estaba agregando a la clase.

    Esta es la forma en que el código fijo parece:

    //wrong
    ccFile.addAttribute(attr);
    
    //right
    mthd.getMethodInfo().addAttribute(attr);

Dejar respuesta

Please enter your comment!
Please enter your name here