Thom
Thom

Reputation: 15042

Finding annotations on an interface

I have an inteface Foo with an implementation Bar. The interface Foo has a method "doMe()" with a method annotation @Secured. This is the only method that is secured.

Now I wrote the following code to go through classes and look for methods with @Secured on them. (This method is not finished yet, I'm trying to get the first unit tests passed.)

  /**
   * Determine if a method is secured
     * @param method the method being checked
     * @return true if the method is secured, false otherwise
     */
    protected static boolean isSecured(Method method) {
  boolean secured = false;
  Annotation[] annotations = method.getAnnotations();
  for(Annotation annotation:annotations){
    if(Secured.class.equals(annotation.getClass())){
      secured = true;
      break;
    }
  }

  if(secured){
    return true;
  }

  return secured;
}

Methods besides doMe() return 0 members on getAnnotations() for both Foo and Bar. The problem is that doMe() also returns 0 members for both Foo and Bar.

I'm looking for someone that knows more about reflection than me, since that shouldn't be hard to find. :)

Thanks.

Upvotes: 3

Views: 214

Answers (2)

Jeff Bowman
Jeff Bowman

Reputation: 95614

Have you ensured that the annotation is visible at runtime? You may need to annotate your annotation with @Retention(RetentionPolicy.RUNTIME). The default, CLASS, won't return the annotation in reflective methods.

See also: RetentionPolicy docs

Upvotes: 6

Daya
Daya

Reputation: 71

Try using getAnnotation instead of getAnnotations, because getAnotations internally uses getDeclaredAnnotations.

More details at Method (Java Platform SE 6)

protected static boolean isSecured(Method method) {

        Secured secured = method.getAnnotation(Secured.class);

        return secured == null ? false : true;
    }

Upvotes: 2

Related Questions