[forge-issues] [JBoss JIRA] (FORGE-369) Return real annotations from org.jboss.forge.parser.java.AnnotationTarget.getAnnotation

Richard Kennard (Updated) (JIRA) jira-events at lists.jboss.org
Sun Oct 30 02:31:45 EDT 2011


     [ https://issues.jboss.org/browse/FORGE-369?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Richard Kennard updated FORGE-369:
----------------------------------

    Description: 
The existing org.jboss.forge.parser.java.Annotation API is a bit unsymmetrical:

public Annotation<O> getAnnotation(final Class<? extends java.lang.annotation.Annotation> type);

You ask it for an Object that implements java.lang.annotation.Annotation, but you get back an Object that implements org.jboss.forge.parser.java.Annotation. It would be nice if you got back a 'real' annotation the same as java.lang.reflect.AnnotatedElement:

public <T  extends java.lang.annotation.Annotation> T getAnnotation(final Class<T> type);

This is a little tricky because java.lang.annotation.Annotation is an interface. If it helps, I am using the attached rough code for now.

  was:
The existing org.jboss.forge.parser.java.Annotation API is a bit unsymmetrical:

public Annotation<O> getAnnotation(final Class<? extends java.lang.annotation.Annotation> type);

You ask it for an Object that implements java.lang.annotation.Annotation, but you get back an Object that implements org.jboss.forge.parser.java.Annotation. It would be nice if you got back a 'real' annotation the same as java.lang.reflect.AnnotatedElement:

public <T  extends java.lang.annotation.Annotation> T getAnnotation(final Class<T> type);

This is a little tricky because java.lang.annotation.Annotation is an interface. If it helps, I am using this rough code for now:

   /**
    * Java annotations are defined as interfaces. Therefore in order to instantiate one, we must create a Proxy.
    */

   public static class AnnotationProxy<T extends Annotation> implements InvocationHandler
   {

      //
      // Private statics
      //

      private final org.jboss.forge.parser.java.Annotation<?> annotationSource;

      private final Class<T> annotationClass;

      //
      // Public statics
      //

      @SuppressWarnings("unchecked")
      public static <T extends Annotation> T newInstance(org.jboss.forge.parser.java.Annotation<?> annotationSource)
      {
         try
         {
            Class<T> annotationClass = (Class<T>) Class.forName("javax.persistence." + annotationSource.getName());

            return (T) java.lang.reflect.Proxy.newProxyInstance(
                     annotationSource.getClass().getClassLoader(),
                     new Class[] { annotationClass },
                     new AnnotationProxy<T>(annotationClass, annotationSource));
         }
         catch (Exception e)
         {
            throw InspectorException.newException(e);
         }
      }

      //
      // Constructor
      //

      private AnnotationProxy(Class<T> annotationClass, org.jboss.forge.parser.java.Annotation<?> annotationSource)
      {
         this.annotationSource = annotationSource;
         this.annotationClass = annotationClass;
      }

      //
      // Public methods
      //

      @Override
      public Object invoke(Object proxy, java.lang.reflect.Method method, Object[] args)
               throws Throwable
      {
         try
         {
            String methodName = method.getName();

            // Get the value from the Forge Annotation class...

            String value = this.annotationSource.getStringValue(methodName);

            // ...if no value, return the default...

            java.lang.reflect.Method annotationMethod = this.annotationClass.getMethod(methodName);

            if ( value == null ) {
               return annotationMethod.getDefaultValue();
            }

            // ...otherwise cast it to the correct class

            Class<?> returnType = annotationMethod.getReturnType();

            if (boolean.class.equals(returnType))
            {
               return Boolean.valueOf(value);
            }
            else if (int.class.equals(returnType))
            {
               return Integer.valueOf(value);
            }

            return value;
         }
         catch (Exception e)
         {
            throw InspectorException.newException(e);
         }
      }
   }


    
> Return real annotations from org.jboss.forge.parser.java.AnnotationTarget.getAnnotation
> ---------------------------------------------------------------------------------------
>
>                 Key: FORGE-369
>                 URL: https://issues.jboss.org/browse/FORGE-369
>             Project: Forge
>          Issue Type: Enhancement
>            Reporter: Richard Kennard
>            Assignee: Lincoln Baxter III
>         Attachments: AnnotationProxy.java
>
>
> The existing org.jboss.forge.parser.java.Annotation API is a bit unsymmetrical:
> public Annotation<O> getAnnotation(final Class<? extends java.lang.annotation.Annotation> type);
> You ask it for an Object that implements java.lang.annotation.Annotation, but you get back an Object that implements org.jboss.forge.parser.java.Annotation. It would be nice if you got back a 'real' annotation the same as java.lang.reflect.AnnotatedElement:
> public <T  extends java.lang.annotation.Annotation> T getAnnotation(final Class<T> type);
> This is a little tricky because java.lang.annotation.Annotation is an interface. If it helps, I am using the attached rough code for now.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the forge-issues mailing list