views:

40

answers:

3

I am using reflection to see if an annotation that is attached to a property of a class, is of a specific type. Current I am doing:

if("javax.validation.Valid".equals(annotation.annotationType().getName())) {
   ...
}

Which strikes me as a little kludgey because it relies on a string that is a fully-qualified class-name. If the namespace changes in the future, this could cause subtle errors.

I would like to do:

if(Class.forName(annotation.annotationType().getName()).isInstance(
     new javax.validation.Valid()
)) {
   ...
}

But javax.validation.Valid is an abstract class and cannot be instantiated. Is there a way to simulate instanceof (or basically use isInstance) against an interface or an abstract class?

+2  A: 

Ok, I guess I should have done a little more research before posting the question. I discovered that I could use Class.isAssignableFrom(Class<?> cls):

import javax.validation.Valid;

if(Valid.class.isAssignableFrom(annotation.annotationType())) {
   ...
}

This seems to do the job. I'm not sure if there are any caveats to using this approach, though.

Vivin Paliath
It's kind of overkill since it's illegal to extend an annotation anyway. Don't know if there's any meaningful performance penalty compared to plain equals.
Affe
@Affe Saw your solution - I wasn't aware that you could simply do a an `.equals` or an `==` on `.class`! Thanks for that. I was under the impression that using `.class` simply compares the `Class` objects and not the actual types.
Vivin Paliath
The class is effectively a singleton. It is guaranteed that there is only one instance of the Class object for a given Type per classloader, so you can compare them that way in java.
Affe
@Affe thanks!..
Vivin Paliath
+1  A: 

Are you just looking for

if (annotation.annotationType().equals(javax.validation.Valid.class)){}

?

Affe
+1  A: 

Since an annotation is just a class, you can simply use an == compare:

if (annotation.annotationType() == Valid.class) { /* ... */ }
Jorn