Java Reflection Annotation Find findAnnotationClass( Class c, Class base)

Here you can find the source of findAnnotationClass( Class c, Class base)

Description

This method will find the @{code T} in public class Foo extends BaseType .

License

Open Source License

Declaration

public static Class<? extends Annotation> findAnnotationClass(
        Class<?> c, Class<?> base) 

Method Source Code

//package com.java2s;
/*/*w w  w  .  jav  a2  s  .  co  m*/
 * Copyright (C) 2009-2011 The Project Lombok Authors.
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

import java.lang.annotation.Annotation;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class Main {
    /**
     * This method will find the @{code T} in {@code public class Foo extends BaseType<T>}.
     * 
     * It returns an annotation type because it is used exclusively to figure out which annotations are
     * being handled by {@link lombok.eclipse.EclipseAnnotationHandler} and {@link lombok.javac.JavacAnnotationHandler}.
     */
    public static Class<? extends Annotation> findAnnotationClass(
            Class<?> c, Class<?> base) {
        if (c == Object.class || c == null)
            return null;
        Class<? extends Annotation> answer = null;

        answer = findAnnotationHelper(base, c.getGenericSuperclass());
        if (answer != null)
            return answer;

        for (Type iface : c.getGenericInterfaces()) {
            answer = findAnnotationHelper(base, iface);
            if (answer != null)
                return answer;
        }

        Class<? extends Annotation> potential = findAnnotationClass(
                c.getSuperclass(), base);
        if (potential != null)
            return potential;
        for (Class<?> iface : c.getInterfaces()) {
            potential = findAnnotationClass(iface, base);
            if (potential != null)
                return potential;
        }

        return null;
    }

    @SuppressWarnings("unchecked")
    private static Class<? extends Annotation> findAnnotationHelper(
            Class<?> base, Type iface) {
        if (iface instanceof ParameterizedType) {
            ParameterizedType p = (ParameterizedType) iface;
            if (!base.equals(p.getRawType()))
                return null;
            Type target = p.getActualTypeArguments()[0];
            if (target instanceof Class<?>) {
                if (Annotation.class.isAssignableFrom((Class<?>) target)) {
                    return (Class<? extends Annotation>) target;
                }
            }

            throw new ClassCastException("Not an annotation type: "
                    + target);
        }
        return null;
    }
}

Related

  1. findAnnotation(final Class annotationClass, final Class beanClass, final Field field)
  2. findAnnotation(final Set annotations, final Class annotationType)
  3. findAnnotation(Method method, Class annotationType)
  4. findAnnotation(Method method, Class type)
  5. findAnnotation(Set annotations, Class annotationClass)
  6. findAnnotationDeclaringClass(Class annotationType, Class clazz)
  7. findAnnotationDeclaringClass(Class annotationType, Class classToFind)
  8. findAnnotationDeclaringClass(Class annotationType, Class clazz)
  9. findAnnotationFromClass(Class target, Class annotation)