blob: 824d408936d86b08835202c4246b6b83382ca78d [file] [log] [blame]
package org.codehaus.jackson.map.introspect;
import java.lang.reflect.*;
import org.codehaus.jackson.map.type.TypeBindings;
import org.codehaus.jackson.type.JavaType;
public final class AnnotatedMethod
extends AnnotatedWithParams
{
final protected Method _method;
// // Simple lazy-caching:
protected Class<?>[] _paramTypes;
/*
/*****************************************************
/* Life-cycle
/*****************************************************
*/
public AnnotatedMethod(Method method, AnnotationMap classAnn, AnnotationMap[] paramAnnotations)
{
super(classAnn, paramAnnotations);
_method = method;
}
/**
* Method that constructs a new instance with settings (annotations, parameter annotations)
* of this instance, but with different physical {@link Method}.
*
* @since 1.7
*/
public AnnotatedMethod withMethod(Method m)
{
return new AnnotatedMethod(m, _annotations, _paramAnnotations);
}
@Override
public AnnotatedMethod withAnnotations(AnnotationMap ann) {
return new AnnotatedMethod(_method, ann, _paramAnnotations);
}
/*
/*****************************************************
/* Annotated impl
/*****************************************************
*/
@Override
public Method getAnnotated() { return _method; }
@Override
public int getModifiers() { return _method.getModifiers(); }
@Override
public String getName() { return _method.getName(); }
/**
* For methods, this returns declared return type, which is only
* useful with getters (setters do not return anything; hence "void"
* type is returned here)
*/
@Override
public Type getGenericType() {
return _method.getGenericReturnType();
}
/**
* For methods, this returns declared return type, which is only
* useful with getters (setters do not return anything; hence "void"
* type is returned here)
*/
@Override
public Class<?> getRawType() {
return _method.getReturnType();
}
/**
* As per [JACKSON-468], we need to also allow declaration of local
* type bindings; mostly it will allow defining bounds.
*/
@Override
public JavaType getType(TypeBindings bindings) {
return getType(bindings, _method.getTypeParameters());
}
@Override
public final Object call() throws Exception {
return _method.invoke(null);
}
@Override
public final Object call(Object[] args) throws Exception {
return _method.invoke(null, args);
}
@Override
public final Object call1(Object arg) throws Exception {
return _method.invoke(null, arg);
}
/*
/********************************************************
/* AnnotatedMember impl
/********************************************************
*/
@Override
public Class<?> getDeclaringClass() { return _method.getDeclaringClass(); }
@Override
public Member getMember() { return _method; }
@Override
public void setValue(Object pojo, Object value)
throws IllegalArgumentException
{
try {
_method.invoke(pojo, value);
} catch (IllegalAccessException e) {
throw new IllegalArgumentException("Failed to setValue() with method "
+getFullName()+": "+e.getMessage(), e);
} catch (InvocationTargetException e) {
throw new IllegalArgumentException("Failed to setValue() with method "
+getFullName()+": "+e.getMessage(), e);
}
}
/*
/*****************************************************
/* Extended API, generic
/*****************************************************
*/
@Override
public int getParameterCount() {
return getParameterTypes().length;
}
public Type[] getParameterTypes() {
return _method.getGenericParameterTypes();
}
@Override
public Class<?> getParameterClass(int index)
{
Class<?>[] types = _method.getParameterTypes();
return (index >= types.length) ? null : types[index];
}
@Override
public Type getParameterType(int index)
{
Type[] types = _method.getGenericParameterTypes();
return (index >= types.length) ? null : types[index];
}
public Class<?>[] getParameterClasses()
{
if (_paramTypes == null) {
_paramTypes = _method.getParameterTypes();
}
return _paramTypes;
}
//public Type getGenericReturnType() { return _method.getGenericReturnType(); }
//public Class<?> getReturnType() { return _method.getReturnType(); }
public String getFullName() {
return getDeclaringClass().getName() + "#" + getName() + "("
+getParameterCount()+" params)";
}
/*
/********************************************************
/* Other
/********************************************************
*/
@Override
public String toString()
{
return "[method "+getName()+", annotations: "+_annotations+"]";
}
}