| package org.codehaus.jackson.map.introspect; |
| |
| import java.lang.reflect.Constructor; |
| import java.lang.reflect.Member; |
| import java.lang.reflect.Type; |
| |
| import org.codehaus.jackson.map.type.TypeBindings; |
| import org.codehaus.jackson.type.JavaType; |
| |
| public final class AnnotatedConstructor |
| extends AnnotatedWithParams |
| { |
| protected final Constructor<?> _constructor; |
| |
| /* |
| /********************************************************** |
| /* Life-cycle |
| /********************************************************** |
| */ |
| |
| public AnnotatedConstructor(Constructor<?> constructor, |
| AnnotationMap classAnn, AnnotationMap[] paramAnn) |
| { |
| super(classAnn, paramAnn); |
| if (constructor == null) { |
| throw new IllegalArgumentException("Null constructor not allowed"); |
| } |
| _constructor = constructor; |
| } |
| |
| @Override |
| public AnnotatedConstructor withAnnotations(AnnotationMap ann) { |
| return new AnnotatedConstructor(_constructor, ann, _paramAnnotations); |
| } |
| |
| /* |
| /********************************************************** |
| /* Annotated impl |
| /********************************************************** |
| */ |
| |
| @Override |
| public Constructor<?> getAnnotated() { return _constructor; } |
| |
| @Override |
| public int getModifiers() { return _constructor.getModifiers(); } |
| |
| @Override |
| public String getName() { return _constructor.getName(); } |
| |
| @Override |
| public Type getGenericType() { |
| return getRawType(); |
| } |
| |
| @Override |
| public Class<?> getRawType() { |
| return _constructor.getDeclaringClass(); |
| } |
| |
| // note: copied verbatim from AnnotatedMethod; hard to generalize |
| /** |
| * 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, _constructor.getTypeParameters()); |
| } |
| |
| /* |
| /********************************************************** |
| /* Extended API |
| /********************************************************** |
| */ |
| |
| @Override |
| public int getParameterCount() { |
| return _constructor.getParameterTypes().length; |
| } |
| |
| @Override |
| public Class<?> getParameterClass(int index) |
| { |
| Class<?>[] types = _constructor.getParameterTypes(); |
| return (index >= types.length) ? null : types[index]; |
| } |
| |
| @Override |
| public Type getParameterType(int index) |
| { |
| Type[] types = _constructor.getGenericParameterTypes(); |
| return (index >= types.length) ? null : types[index]; |
| } |
| |
| @Override |
| public final Object call() throws Exception { |
| return _constructor.newInstance(); |
| } |
| |
| @Override |
| public final Object call(Object[] args) throws Exception { |
| return _constructor.newInstance(args); |
| } |
| |
| @Override |
| public final Object call1(Object arg) throws Exception { |
| return _constructor.newInstance(arg); |
| } |
| |
| /* |
| /********************************************************** |
| /* AnnotatedMember impl |
| /********************************************************** |
| */ |
| |
| @Override |
| public Class<?> getDeclaringClass() { return _constructor.getDeclaringClass(); } |
| |
| @Override |
| public Member getMember() { return _constructor; } |
| |
| @Override |
| public void setValue(Object pojo, Object value) |
| throws UnsupportedOperationException |
| { |
| throw new UnsupportedOperationException("Cannot call setValue() on constructor of " |
| +getDeclaringClass().getName()); |
| } |
| |
| /* |
| /********************************************************** |
| /* Extended API, specific annotations |
| /********************************************************** |
| */ |
| |
| @Override |
| public String toString() { |
| return "[constructor for "+getName()+", annotations: "+_annotations+"]"; |
| } |
| } |
| |