001    package edu.rice.cs.cunit.subAnnot;
002    
003    import java.lang.annotation.Annotation;
004    import java.lang.reflect.Proxy;
005    import java.util.List;
006    import java.util.ArrayList;
007    
008    /**
009     * Interface for annotated elements supporting annotations with subtyping.
010     * 
011     * @author Mathias Ricken
012     */
013    public interface AnnotatedElementEx {
014        /**
015         * Returns true if the class file was found and additional information is available beyond what
016         * Java's Class class might return.
017         * @return true if class file was found.
018         */
019        public boolean isAvailable();
020        
021        /**
022         * Returns true if an annotation for the specified type or one of its subtypes is present on this element,
023         * else false. This method is designed primarily for convenient access to marker annotations.
024         * @param c class
025         * @return true if present
026         */
027        public boolean isAnnotationPresent(ClassEx<? extends Annotation> c);
028    
029        /**
030         * Returns true if an annotation for the specified type or one of its subtypes is present on this element,
031         * else false. This method is designed primarily for convenient access to marker annotations.
032         * @param c class
033         * @return true if present
034         */
035        public boolean isAnnotationPresent(Class<? extends Annotation> c);
036    
037        /**
038         * Return an array of the annotations attached to the element that are subclasses of the specified class.
039         * @param c class
040         * @return array of annotations
041         */
042        public <A extends Annotation> List<A> getAnnotations(ClassEx<A> c);
043    
044        /**
045         * Return an array of the annotations attached to the element that are subclasses of the specified class.
046         * @param c class
047         * @return array of annotations
048         */
049        @SuppressWarnings("unchecked")
050        public <A extends Annotation> List<A> getAnnotations(Class<A> c);
051    
052        /**
053         * Return an array of all annotations attached to the element.
054         * @return array of annotations
055         */
056        public Annotation[] getAnnotations();
057    
058        /**
059         * Returns true if an annotation for the specified type or one of its subtypes is present on this element,
060         * else false. This method is designed primarily for convenient access to marker annotations.
061         * Contrary to isAnnotationPresent, this does not consider annotations inherited from superclasses.
062         * @param c class
063         * @return true if present
064         */
065        public boolean isDeclaredAnnotationPresent(ClassEx<? extends Annotation> c);
066    
067        /**
068         * Returns true if an annotation for the specified type or one of its subtypes is present on this element,
069         * else false. This method is designed primarily for convenient access to marker annotations.
070         * Contrary to isAnnotationPresent, this does not consider annotations inherited from superclasses.
071         * @param c class
072         * @return true if present
073         */
074        public boolean isDeclaredAnnotationPresent(Class<? extends Annotation> c);
075    
076        /**
077         * Return an array of the annotations attached to the element that are subclasses of the specified class.
078         * Contrary to getAnnotations, this does not consider annotations inherited from superclasses.
079         * @param c class
080         * @return array of annotations
081         */
082        public <A extends Annotation> List<A> getDeclaredAnnotations(ClassEx<A> c);
083    
084        /**
085         * Return an array of the annotations attached to the element that are subclasses of the specified class.
086         * Contrary to isAnnotationPresent, this does not consider annotations inherited from superclasses.
087         * @param c class
088         * @return array of annotations
089         */
090        @SuppressWarnings("unchecked")
091        public <A extends Annotation> List<A> getDeclaredAnnotations(Class<A> c);
092    
093        /**
094         * Return an array of all annotations attached directly to the element.
095         * Contrary to getAnnotations(), this does not consider annotations inherited from superclasses.
096         * @return array of annotations
097         */
098        public Annotation[] getDeclaredAnnotations();
099    }