Добавление аннотации ко времени выполнения генерировало использование метода/класса Javassist

Я использую Javassist для генерации класса foo, с методом bar, но я, может казаться, не нахожу способ добавить аннотацию (сама аннотация не является сгенерированным временем выполнения) к методу. Код, который я попробовал, похож на это:

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

И очевидно я делаю что-то не так с тех пор annots пустой массив.

Это - то, как аннотация похожа:

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

23
задан Karl Richter 18 April 2018 в 13:33
поделиться

1 ответ

В конце концов, решил, я добавлял аннотацию не в то место. Я хотел добавить его в метод, но я добавлял его в класс.

Вот как выглядит фиксированный код:

// wrong
ccFile.addAttribute(attr);

// right
mthd.getMethodInfo().addAttribute(attr);
28
ответ дан 29 November 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: