/* * Copyright 2011 Blazebit */ package com.blazebit.reflection; import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; /** * * @author Christian Beikov */ public class MethodParameter { private Constructor<?> constructor; private Method method; private int index; MethodParameter(Method method, int index) { if (method == null) { throw new NullPointerException("Method must not be null"); } this.method = method; this.index = index; } MethodParameter(Constructor<?> constructor, int index) { if (constructor == null) { throw new NullPointerException("Method must not be null"); } this.constructor = constructor; this.index = index; } public Constructor<?> getConstructor() { return constructor; } public int getIndex() { return index; } public Class<?> getType() { return method != null ? method.getParameterTypes()[index] : constructor .getParameterTypes()[index]; } public Class<?> getResolvedType(Class<?> concreteClass) { Type t = method != null ? method.getGenericParameterTypes()[index] : constructor.getGenericParameterTypes()[index]; if (t instanceof TypeVariable<?>) { return ReflectionUtils.resolveTypeVariable(concreteClass, (TypeVariable<?>) t); } return getType(); } public Class<?>[] getResolvedTypeParameters(Class<?> concreteClass) { Type t = method != null ? method.getGenericParameterTypes()[index] : constructor.getGenericParameterTypes()[index]; return ReflectionUtils.resolveTypeArguments(concreteClass, t); } public <T extends Annotation> T getAnnotation(Class<T> annotationClass) { if (annotationClass == null) { throw new NullPointerException("annotationClass must not be null"); } for (Annotation a : getAnnotations()) { if (annotationClass.isInstance(a)) { return annotationClass.cast(a); } } return null; } public Annotation[] getAnnotations() { return method != null ? method.getParameterAnnotations()[index] : constructor.getParameterAnnotations()[index]; } public Method getMethod() { return method; } }