AnnotationFunctions.java

package eu.javaexperience.annotation;

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

import eu.javaexperience.interfaces.simple.getBy.GetBy1;
import eu.javaexperience.reflect.Mirror;

public class AnnotationFunctions
{
	public static <T, C extends Annotation> GetBy1<T, AccessibleObject> examineAnnotationValue(final Class<C> annotationClass, final String fieldMethodName)
	{
		return new GetBy1<T, AccessibleObject>()
		{
			@Override
			public T getBy(AccessibleObject a)
			{
				C[] cs = a.getDeclaredAnnotationsByType(annotationClass);
				if(cs.length > 0)
				{
					try
					{
						Method m = annotationClass.getDeclaredMethod(fieldMethodName);
						if(null != m)
						{
							return (T) m.invoke(cs[0]);
						}
					}
					catch(Exception e)
					{
						Mirror.propagateAnyway(e);
					}
				}
				
				return null;
			}
		};
	}
}