001 package net.sourceforge.retroweaver.runtime.java.lang.reflect; 002 003 import static org.objectweb.asm.Opcodes.ACC_SYNTHETIC; 004 import static org.objectweb.asm.Opcodes.ACC_VARARGS; 005 006 import java.lang.reflect.Constructor; 007 import java.lang.reflect.Method; 008 009 import net.sourceforge.retroweaver.runtime.java.lang.annotation.AIB; 010 import net.sourceforge.retroweaver.runtime.java.lang.annotation.Annotation; 011 012 /** 013 * A mirror of java.lang.reflect.Constructor. Unfortunately, although this class 014 * is almost a direct copy of Method_, there's not an easy way to share the 015 * implementation between the two, because Method and Constructor don't have any 016 * sort of typed relationship. 017 * 018 * @author Toby Reyelts Date: Feb 21, 2005 Time: 2:40:01 AM 019 */ 020 public class Constructor_ { 021 022 private Constructor_() { 023 // private constructor 024 } 025 026 // Returns this element's annotation for the specified type if such an 027 // annotation is present, else null. 028 public static <T extends Annotation> T getAnnotation(final Constructor cons, final Class<T> annotationType) { 029 final Class c = cons.getDeclaringClass(); 030 return AIB.getAib(c).getMethodAnnotation(cons.getName(), cons.getParameterTypes(), Void.class, annotationType); 031 } 032 033 // Returns all annotations present on this element. 034 // 035 // We have to search superclasses and interfaces, looking for annotations 036 // which are meta-annotated with the @Inherited Annotation. 037 // (Yuk) 038 // 039 public static Annotation[] getAnnotations(final Constructor cons) { 040 return getDeclaredAnnotations(cons); 041 } 042 043 // Returns all annotations that are directly present on this element. 044 public static Annotation[] getDeclaredAnnotations(final Constructor cons) { 045 final Class c = cons.getDeclaringClass(); 046 return AIB.getAib(c).getMethodAnnotations(cons.getName(), cons.getParameterTypes(), Void.class); 047 } 048 049 // Returns true if an annotation for the specified type is present on this 050 // element, else false. 051 public static boolean isAnnotationPresent(final Constructor cons, final Class<? extends Annotation> annotationType) { 052 return getAnnotation(cons, annotationType) != null; 053 } 054 055 public static Annotation[][] getParameterAnnotations(final Constructor cons) { 056 final Class c = cons.getDeclaringClass(); 057 return AIB.getAib(c).getMethodParameterAnnotations(cons.getName(), cons.getParameterTypes(), Void.class); 058 } 059 060 // Returns true if this constructor was declared to take a variable number of arguments; returns false otherwise. 061 public static boolean isVarArgs(final Constructor cons) { 062 final Class c = cons.getDeclaringClass(); 063 return ReflectionDescriptor.getReflectionDescriptor(c).testConstructorAccess(cons, ACC_VARARGS); 064 } 065 066 // Returns true if this constructor is a synthetic constructor; returns false otherwise. 067 public static boolean isSynthetic(final Constructor cons) { 068 final Class c = cons.getDeclaringClass(); 069 return ReflectionDescriptor.getReflectionDescriptor(c).testConstructorAccess(cons, ACC_SYNTHETIC); 070 } 071 072 }