package org.etk.reflect.jlr.metadata; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import org.etk.reflect.api.metadata.AnnotationMetadata; public abstract class JLReflectionAnnotationMetadata<E> implements AnnotationMetadata<Type, E, Annotation, Method> { public Collection<Method> getAnnotationParameters(Annotation annotation) { Method[] methods = annotation.annotationType().getDeclaredMethods(); ArrayList<Method> list = new ArrayList<Method>(methods.length); for (Method m : methods) { list.add(m); } return list; } public Type getAnnotationType(Annotation annotation) { return annotation.annotationType(); } public String getAnnotationParameterName(Method parameter) { return parameter.getName(); } public Type getAnnotationParameterType(Method parameter) { return parameter.getGenericReturnType(); } public List<?> getAnnotationParameterValue(Annotation annotation, Method parameter) { try { Object value = parameter.invoke(annotation); if (value.getClass().isArray()) { Object[] array = (Object[])value; for (int i = 0;i < array.length;i++) { array[i] = unwrap(array[i]); } return Arrays.asList(array); } else { return Arrays.asList(unwrap(value)); } } catch (Exception e) { throw new AssertionError(e); } } private Object unwrap(Object o) { if (o instanceof Enum) { return ((Enum)o).name(); } else { return o; } } }