Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create an instance of an annotation

I am trying to do some Java annotation magic. I must say I am still catching up on annotation tricks and that certain things are still not quite clear to me.

So... I have some annotated classes, methods and fields. I have a method, which uses reflection to run some checks on the classes and inject some values into a class. This all works fine.

However, I am now facing a case where I need an instance (so to say) of an annotation. So... annotations aren't like regular interfaces and you can't do an anonymous implementation of a class. I get it. I have looked around some posts here regarding similar problems, but I can't seem to be able to find the answer to what I am looking for.

I would basically like to get and instance of an annotation and be able to set some of it's fields using reflection (I suppose). Is there at all a way to do this?

like image 848
carlspring Avatar asked Apr 30 '13 12:04

carlspring


People also ask

How do you inherit annotations?

Annotations, just like methods or fields, can be inherited between class hierarchies. If an annotation declaration is marked with @Inherited , then a class that extends another class with this annotation can inherit it. The annotation can be overridden in case the child class has the annotation.


1 Answers

Well, it's apparently nothing all that complicated. Really!

As pointed out by a colleague, you can simply create an anonymous instance of the annotation (like any interface) like this:

MyAnnotation:

public @interface MyAnnotation {      String foo();  } 

Invoking code:

class MyApp {     MyAnnotation getInstanceOfAnnotation(final String foo)     {         MyAnnotation annotation = new MyAnnotation()         {             @Override             public String foo()             {                 return foo;             }              @Override             public Class<? extends Annotation> annotationType()             {                 return MyAnnotation.class;             }         };          return annotation;     } } 

Credits to Martin Grigorov.

like image 77
carlspring Avatar answered Oct 06 '22 20:10

carlspring