1 package com.fasterxml.jackson.databind.introspect; 2 3 import java.lang.reflect.*; 4 5 import com.fasterxml.jackson.databind.JavaType; 6 import com.fasterxml.jackson.databind.util.ClassUtil; 7 8 public final class AnnotatedConstructor 9 extends AnnotatedWithParams 10 { 11 private static final long serialVersionUID = 1L; 12 13 protected final Constructor<?> _constructor; 14 15 /** 16 * Field that is used to make JDK serialization work with this 17 * object. 18 * 19 * @since 2.1 20 */ 21 protected Serialization _serialization; 22 23 /* 24 /********************************************************** 25 /* Life-cycle 26 /********************************************************** 27 */ 28 AnnotatedConstructor(TypeResolutionContext ctxt, Constructor<?> constructor, AnnotationMap classAnn, AnnotationMap[] paramAnn)29 public AnnotatedConstructor(TypeResolutionContext ctxt, Constructor<?> constructor, 30 AnnotationMap classAnn, AnnotationMap[] paramAnn) 31 { 32 super(ctxt, classAnn, paramAnn); 33 if (constructor == null) { 34 throw new IllegalArgumentException("Null constructor not allowed"); 35 } 36 _constructor = constructor; 37 } 38 39 /** 40 * Method used for JDK serialization support 41 * @since 2.1 42 */ AnnotatedConstructor(Serialization ser)43 protected AnnotatedConstructor(Serialization ser) 44 { 45 super(null, null, null); 46 _constructor = null; 47 _serialization = ser; 48 } 49 50 @Override withAnnotations(AnnotationMap ann)51 public AnnotatedConstructor withAnnotations(AnnotationMap ann) { 52 return new AnnotatedConstructor(_typeContext, _constructor, ann, _paramAnnotations); 53 } 54 55 /* 56 /********************************************************** 57 /* Annotated impl 58 /********************************************************** 59 */ 60 61 @Override getAnnotated()62 public Constructor<?> getAnnotated() { return _constructor; } 63 64 @Override getModifiers()65 public int getModifiers() { return _constructor.getModifiers(); } 66 67 @Override getName()68 public String getName() { return _constructor.getName(); } 69 70 @Override getType()71 public JavaType getType() { 72 return _typeContext.resolveType(getRawType()); 73 } 74 75 @Override getRawType()76 public Class<?> getRawType() { 77 return _constructor.getDeclaringClass(); 78 } 79 80 /* 81 /********************************************************** 82 /* Extended API 83 /********************************************************** 84 */ 85 86 @Override getParameterCount()87 public int getParameterCount() { 88 return _constructor.getParameterTypes().length; 89 } 90 91 @Override getRawParameterType(int index)92 public Class<?> getRawParameterType(int index) 93 { 94 Class<?>[] types = _constructor.getParameterTypes(); 95 return (index >= types.length) ? null : types[index]; 96 } 97 98 @Override getParameterType(int index)99 public JavaType getParameterType(int index) { 100 Type[] types = _constructor.getGenericParameterTypes(); 101 if (index >= types.length) { 102 return null; 103 } 104 return _typeContext.resolveType(types[index]); 105 } 106 107 @Override 108 @Deprecated // since 2.7 getGenericParameterType(int index)109 public Type getGenericParameterType(int index) { 110 Type[] types = _constructor.getGenericParameterTypes(); 111 if (index >= types.length) { 112 return null; 113 } 114 return types[index]; 115 } 116 117 @Override call()118 public final Object call() throws Exception { 119 return _constructor.newInstance(); 120 } 121 122 @Override call(Object[] args)123 public final Object call(Object[] args) throws Exception { 124 return _constructor.newInstance(args); 125 } 126 127 @Override call1(Object arg)128 public final Object call1(Object arg) throws Exception { 129 return _constructor.newInstance(arg); 130 } 131 132 /* 133 /********************************************************** 134 /* AnnotatedMember impl 135 /********************************************************** 136 */ 137 138 @Override getDeclaringClass()139 public Class<?> getDeclaringClass() { return _constructor.getDeclaringClass(); } 140 141 @Override getMember()142 public Member getMember() { return _constructor; } 143 144 @Override setValue(Object pojo, Object value)145 public void setValue(Object pojo, Object value) 146 throws UnsupportedOperationException 147 { 148 throw new UnsupportedOperationException("Cannot call setValue() on constructor of " 149 +getDeclaringClass().getName()); 150 } 151 152 @Override getValue(Object pojo)153 public Object getValue(Object pojo) 154 throws UnsupportedOperationException 155 { 156 throw new UnsupportedOperationException("Cannot call getValue() on constructor of " 157 +getDeclaringClass().getName()); 158 } 159 160 /* 161 /********************************************************** 162 /* Extended API, specific annotations 163 /********************************************************** 164 */ 165 166 @Override toString()167 public String toString() { 168 return "[constructor for "+getName()+", annotations: "+_annotations+"]"; 169 } 170 171 @Override hashCode()172 public int hashCode() { 173 return _constructor.getName().hashCode(); 174 } 175 176 @Override equals(Object o)177 public boolean equals(Object o) { 178 if (o == this) return true; 179 return ClassUtil.hasClass(o, getClass()) 180 && (((AnnotatedConstructor) o)._constructor == _constructor); 181 } 182 183 /* 184 /********************************************************** 185 /* JDK serialization handling 186 /********************************************************** 187 */ 188 writeReplace()189 Object writeReplace() { 190 return new AnnotatedConstructor(new Serialization(_constructor)); 191 } 192 readResolve()193 Object readResolve() { 194 Class<?> clazz = _serialization.clazz; 195 try { 196 Constructor<?> ctor = clazz.getDeclaredConstructor(_serialization.args); 197 // 06-Oct-2012, tatu: Has "lost" its security override, must force back 198 if (!ctor.isAccessible()) { 199 ClassUtil.checkAndFixAccess(ctor, false); 200 } 201 return new AnnotatedConstructor(null, ctor, null, null); 202 } catch (Exception e) { 203 throw new IllegalArgumentException("Could not find constructor with " 204 +_serialization.args.length+" args from Class '"+clazz.getName()); 205 } 206 } 207 208 /** 209 * Helper class that is used as the workaround to persist 210 * Field references. It basically just stores declaring class 211 * and field name. 212 */ 213 private final static class Serialization 214 implements java.io.Serializable 215 { 216 private static final long serialVersionUID = 1L; 217 protected Class<?> clazz; 218 protected Class<?>[] args; 219 Serialization(Constructor<?> ctor)220 public Serialization(Constructor<?> ctor) { 221 clazz = ctor.getDeclaringClass(); 222 args = ctor.getParameterTypes(); 223 } 224 } 225 } 226