sirven reflexion que para notacion las example ejemplo crear categorias anotaciones annotation java annotations javassist

reflexion - reflection en java



Agregar una anotación a un método/clase generado por el tiempo de ejecución usando Javassist (1)

Estoy usando Javassist para generar una clase foo , con bar métodos, pero parece que no puedo encontrar una manera de agregar una anotación (la anotación en sí no se genera en tiempo de ejecución) al método. El código que probé se ve así:

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 los annots son una matriz vacía.

Así es como se ve la anotación:

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { int value(); }


Resuelto eventualmente, estaba agregando la anotación al lugar equivocado. Quería agregarlo al método, pero lo estaba agregando a la clase.

Así es como se ve el código fijo:

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