Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamically add annotation to an existing class

Tags:

java

I have the following class

public class Person {
   ...
}

I would like to create another class that would look like this.

@SomeAnnotation
public class Person {
   ...
}

Via a simple method like so.

public static Class addAnnotation(Class originalType, Class<? extends Annotation> annotation) {
   // what goes here?
}

Is there an easy way to do this via ASM for example? What dependencies would I need. I have tried to Google this however the examples I have found are either incomplete or are doing something else. Other frameworks such as javassist would be just as good.

like image 671
ng. Avatar asked May 31 '10 16:05

ng.


1 Answers

You can use javassist project for that.

With javassist it will be look something like that:

ClassFile cf = ... ;
ConstPool cp = cf.getConstPool();
AnnotationsAttribute attr = new AnnotationsAttribute(cp, AnnotationsAttribute.visibleTag);

Annotation a = new Annotation("Author", cp);
a.addMemberValue("name", new StringMemberValue("Chiba", cp));
attr.setAnnotation(a);
cf.addAttribute(attr);
cf.setVersionToJava5();

Hope it helps. Alexey

like image 155
Alexey Ogarkov Avatar answered Oct 06 '22 14:10

Alexey Ogarkov