001 package net.sourceforge.retroweaver.runtime.java.lang.reflect; 002 003 import static org.objectweb.asm.Opcodes.ACC_BRIDGE; 004 import static org.objectweb.asm.Opcodes.ACC_SYNTHETIC; 005 import static org.objectweb.asm.Opcodes.ACC_VARARGS; 006 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.Method. 014 * 015 * @author Toby Reyelts Date: Feb 20, 2005 Time: 11:10:46 PM 016 */ 017 public class Method_ { 018 019 private Method_() { 020 // private constructor 021 } 022 023 // Returns the default value for the annotation member represented by this 024 // <tt>Method</tt> instance. 025 public static Object getDefaultValue(final Method m) { 026 final Class c = m.getDeclaringClass(); 027 028 if (!c.isAnnotation()) { 029 return null; 030 } 031 032 return AIB.getAib(c).getDefaultValue(m.getName()); 033 } 034 035 // Returns this element's annotation for the specified type if such an 036 // annotation is present, else null. 037 public static <T extends Annotation> T getAnnotation(final Method m, final Class<T> annotationType) { 038 final Class c = m.getDeclaringClass(); 039 return AIB.getAib(c).getMethodAnnotation(m.getName(), m.getParameterTypes(), m.getReturnType(), annotationType); 040 } 041 042 // Returns all annotations present on this element. 043 public static Annotation[] getAnnotations(final Method m) { 044 return getDeclaredAnnotations(m); 045 } 046 047 // Returns all annotations that are directly present on this element. 048 public static Annotation[] getDeclaredAnnotations(final Method m) { 049 final Class c = m.getDeclaringClass(); 050 return AIB.getAib(c).getMethodAnnotations(m.getName(), m.getParameterTypes(), m.getReturnType()); 051 } 052 053 // Returns true if an annotation for the specified type is present on this 054 // element, else false. 055 public static boolean isAnnotationPresent(final Method m, final Class<? extends Annotation> annotationType) { 056 return getAnnotation(m, annotationType) != null; 057 } 058 059 public static Annotation[][] getParameterAnnotations(final Method m) { 060 final Class c = m.getDeclaringClass(); 061 return AIB.getAib(c).getMethodParameterAnnotations(m.getName(), m.getParameterTypes(), m.getReturnType()); 062 } 063 064 // Returns true if this method is a bridge method; returns false otherwise. 065 public static boolean isBridge(final Method m) { 066 final Class c = m.getDeclaringClass(); 067 return ReflectionDescriptor.getReflectionDescriptor(c).testMethodAccess(m, ACC_BRIDGE); 068 } 069 070 // Returns true if this method was declared to take a variable number of arguments; returns false otherwise. 071 public static boolean isVarArgs(final Method m) { 072 final Class c = m.getDeclaringClass(); 073 return ReflectionDescriptor.getReflectionDescriptor(c).testMethodAccess(m, ACC_VARARGS); 074 } 075 076 // Returns true if this method is a synthetic method; returns false otherwise. 077 public static boolean isSynthetic(final Method m) { 078 final Class c = m.getDeclaringClass(); 079 return ReflectionDescriptor.getReflectionDescriptor(c).testMethodAccess(m, ACC_SYNTHETIC); 080 } 081 082 }