Добавление аннотации к классу с использованием Javassist - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь добавить аннотацию к классу динамически, используя javassist

Мой код выглядит следующим образом

private Class addAnnotation(String className,String annotationName, int frequency) throws Exception{
    ClassPool pool = ClassPool.getDefault();
    CtClass ctClass = pool.makeClass(className);

    ClassFile classFile = ctClass.getClassFile();
    ConstPool constpool = classFile.getConstPool();

    AnnotationsAttribute annotationsAttribute = new AnnotationsAttribute(constpool, AnnotationsAttribute.visibleTag);
    Annotation annotation = new Annotation(annotationName, constpool);
    annotation.addMemberValue("frequency", new IntegerMemberValue(classFile.getConstPool(), frequency));
    annotationsAttribute.setAnnotation(annotation);

    ctClass.getClassFile().addAttribute(annotationsAttribute);

    return ctClass.toClass();
  }

Но возвращенный класс не имеет добавленной аннотации.

Class annotatedClass = addFrequencyAnnotation(MyClass.class.getSimpleName(),
          MyAnnotation.class.getSimpleName(), 10);

annotatedClass.isAnnotationPresent(MyAnnotation.class); // Returns false

Я не уверен, чего не хватает в моем коде.Может ли кто-нибудь помочь определить проблему?

1 Ответ

0 голосов
/ 31 мая 2018

Вы должны использовать MyAnnotation.class.getName вместо MyAnnotation.class.getSimpleName.Потому что есть MyAnnotation, но нет yourpackage.MyAnnotation.

  public static void main(String[] args) throws Exception {
    Class<?> annotatedClass = addAnnotation(MyClass.class.getName(), MyAnnotation.class.getName(), 10);

    System.out.println(annotatedClass.getAnnotation(MyAnnotation.class));
  }

  private static Class<?> addAnnotation(String className, String annotationName, int frequency) throws Exception {
    ClassPool pool = ClassPool.getDefault();
    CtClass ctClass = pool.makeClass(className + "1");//because MyClass has been defined

    ClassFile classFile = ctClass.getClassFile();
    ConstPool constpool = classFile.getConstPool();

    AnnotationsAttribute annotationsAttribute = new AnnotationsAttribute(constpool, AnnotationsAttribute.visibleTag);
    Annotation annotation = new Annotation(annotationName, constpool);
    annotation.addMemberValue("frequency", new IntegerMemberValue(classFile.getConstPool(), frequency));
    annotationsAttribute.setAnnotation(annotation);

    ctClass.getClassFile().addAttribute(annotationsAttribute);
    return ctClass.toClass();
  }
...