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);