22

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?

Vivin Paliath
  • 94,126
  • 40
  • 223
  • 295

5 Answers5

49

Are you just looking for

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

?

Affe
  • 47,174
  • 11
  • 83
  • 83
25

Or even simpler:

if (annotation instanceof Valid) { /* ... */ }
yurez
  • 2,826
  • 1
  • 28
  • 22
  • I think this answer should be higher. If you just want to see if an Annotation instance is of a particular type, just use instanceOf, as it's more straightforward than doing annotation.annotationType().equals(javax.validation.Valid.class) – adevine Nov 11 '13 at 00:34
  • 8
    Just an observation, this will be always false if the programmer forgets to annotate the @interface with `@Retention(value=RUNTIME)` – Felype Dec 09 '15 at 13:43
13

Just for completeness' sake, another possibility is

if (this.getClass().isAnnotationPresent(MyCustomAnnotation.class)) {
sleske
  • 81,358
  • 34
  • 189
  • 227
5

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
  • 94,126
  • 40
  • 223
  • 295
  • 1
    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 Jul 27 '10 at 22:05
  • @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 Jul 27 '10 at 22:11
  • 1
    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 Jul 27 '10 at 22:22
3

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

if (annotation.annotationType() == Valid.class) { /* ... */ }
Jorn
  • 20,612
  • 18
  • 79
  • 126