[weld-issues] [JBoss JIRA] Created: (WELDX-95) Need common method of scanning for annotations (static or dynamic)

Lincoln Baxter III (JIRA) jira-events at lists.jboss.org
Mon Apr 12 15:35:37 EDT 2010


Need common method of scanning for annotations (static or dynamic)
------------------------------------------------------------------

                 Key: WELDX-95
                 URL: https://jira.jboss.org/jira/browse/WELDX-95
             Project: Weld Extensions
          Issue Type: Feature Request
          Components: Weld Extensions
            Reporter: Lincoln Baxter III


There needs to be a common way of scanning classes and methods for annotation information: A Utility class for common @{@link Annotation} scanning operations. Enables scanning classes and methods for specific annotation types, and retrieving those annotation instances.

Here is the solution currently being used in Faces Module -- it still needs a call to the BeanManager.getStereotypeDefinition(...) in order to be fully portable.
----------------------
package org.jboss.weld.extensions.util;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

import javax.enterprise.inject.Stereotype;

/**
 * Utility class for common @{@link Annotation} scanning operations. Enables
 * scanning classes and methods for specific annotation types, and retrieving
 * those annotation instances.
 * <p>
 * 
 * @author <a href="mailto:lincolnbaxter at gmail.com>Lincoln Baxter, III</a>
 * 
 */
public class Annotations
{
   /**
    * Discover if a Method <b>m</b> has been annotated with <b>type</b>. This
    * also discovers annotations defined through a @{@link Stereotype}.
    * 
    * @param m The method to inspect.
    * @param type The targeted annotation class
    * 
    * @return True if annotation is present either on the method itself, or on
    *         the declaring class of the method. Returns false if the annotation
    *         is not present.
    */
   public static boolean has(final Method m, final Class<? extends Annotation> type)
   {
      boolean result = false;
      if (m.isAnnotationPresent(type))
      {
         result = true;
      }
      else
      {
         for (Annotation a : m.getAnnotations())
         {
            if (a.annotationType().isAnnotationPresent(type))
            {
               result = true;
            }
         }
      }

      if (result == false)
      {
         result = has(m.getDeclaringClass(), type);
      }
      return result;
   }

   /**
    * Discover if a Class <b>c</b> has been annotated with <b>type</b>. This
    * also discovers annotations defined through a @{@link Stereotype}.
    * 
    * @param c The class to inspect.
    * @param type The targeted annotation class
    * 
    * @return True if annotation is present either on class, false if the
    *         annotation is not present.
    */
   public static boolean has(final Class<?> c, final Class<? extends Annotation> type)
   {
      boolean result = false;
      if (c.isAnnotationPresent(type))
      {
         result = true;
      }
      else
      {
         for (Annotation a : c.getAnnotations())
         {
            if (a.annotationType().isAnnotationPresent(type))
            {
               result = true;
            }
         }
      }
      return result;
   }

   /**
    * Inspect method <b>m</b> for a specific <b>type</b> of annotation. This
    * also discovers annotations defined through a @ {@link Stereotype}.
    * 
    * @param m The method to inspect.
    * @param type The targeted annotation class
    * 
    * @return The annotation instance found on this method or enclosing class,
    *         or null if no matching annotation was found.
    */
   public static <A extends Annotation> A get(final Method m, final Class<A> type)
   {
      A result = m.getAnnotation(type);
      if (result == null)
      {
         for (Annotation a : m.getAnnotations())
         {
            if (a.annotationType().isAnnotationPresent(type))
            {
               result = a.annotationType().getAnnotation(type);
            }
         }
      }
      if (result == null)
      {
         result = get(m.getDeclaringClass(), type);
      }
      return result;
   }

   /**
    * Inspect class <b>c</b> for a specific <b>type</b> of annotation. This also
    * discovers annotations defined through a @ {@link Stereotype}.
    * 
    * @param c The class to inspect.
    * @param type The targeted annotation class
    * 
    * @return The annotation instance found on this class, or null if no
    *         matching annotation was found.
    */
   public static <A extends Annotation> A get(final Class<?> c, final Class<A> type)
   {
      A result = c.getAnnotation(type);
      if (result == null)
      {
         for (Annotation a : c.getAnnotations())
         {
            if (a.annotationType().isAnnotationPresent(type))
            {
               result = a.annotationType().getAnnotation(type);
            }
         }
      }
      return result;
   }
}


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the weld-issues mailing list