1 package com.fasterxml.jackson.databind.introspect;
2
3 import java.lang.annotation.Annotation;
4 import java.lang.reflect.Type;
5
6 import com.fasterxml.jackson.databind.JavaType;
7
8 /**
9 * Intermediate base class that encapsulates features that
10 * constructors and methods share.
11 */
12 public abstract class AnnotatedWithParams
13 extends AnnotatedMember
14 {
15 private static final long serialVersionUID = 1L;
16
17 /**
18 * Annotations associated with parameters of the annotated
19 * entity (method or constructor parameters)
20 */
21 protected final AnnotationMap[] _paramAnnotations;
22
23 /*
24 /**********************************************************
25 /* Life-cycle
26 /**********************************************************
27 */
28
29 protected AnnotatedWithParams(TypeResolutionContext ctxt, AnnotationMap annotations, AnnotationMap[] paramAnnotations)
30 {
31 super(ctxt, annotations);
32 _paramAnnotations = paramAnnotations;
33 }
34
35 /**
36 * @since 2.8.1
37 */
38 protected AnnotatedWithParams(AnnotatedWithParams base, AnnotationMap[] paramAnnotations) {
39 super(base);
40 _paramAnnotations = paramAnnotations;
41 }
42
43 /**
44 * Method called to override a method parameter annotation,
45 * usually due to a mix-in
46 * annotation masking or overriding an annotation 'real' method
47 * has.
48 */
49 public final void addOrOverrideParam(int paramIndex, Annotation a)
50 {
51 AnnotationMap old = _paramAnnotations[paramIndex];
52 if (old == null) {
53 old = new AnnotationMap();
54 _paramAnnotations[paramIndex] = old;
55 }
56 old.add(a);
57 }
58
59 /**
60 * Method called by parameter object when an augmented instance is created;
61 * needs to replace parameter with new instance
62 */
63 protected AnnotatedParameter replaceParameterAnnotations(int index, AnnotationMap ann)
64 {
65 _paramAnnotations[index] = ann;
66 return getParameter(index);
67 }
68
69 /*
70 /**********************************************************
71 /* Extended API
72 /**********************************************************
73 */
74
75 public final AnnotationMap getParameterAnnotations(int index)
76 {
77 if (_paramAnnotations != null) {
78 if (index >= 0 && index < _paramAnnotations.length) {
79 return _paramAnnotations[index];
80 }
81 }
82 return null;
83 }
84
85 public final AnnotatedParameter getParameter(int index) {
86 return new AnnotatedParameter(this, getParameterType(index),
87 _typeContext, getParameterAnnotations(index), index);
88 }
89
90 public abstract int getParameterCount();
91
92 public abstract Class<?> getRawParameterType(int index);
93
94 /**
95 * @since 2.7
96 */
97 public abstract JavaType getParameterType(int index);
98
99 /**
100 * @deprecated Since 2.7, remove in 2.9
101 */
102 @Deprecated
103 public abstract Type getGenericParameterType(int index);
104
105 public final int getAnnotationCount() { return _annotations.size(); }
106
107 /**
108 * Method that can be used to (try to) call this object without arguments.
109 * This may succeed or fail, depending on expected number
110 * of arguments: caller needs to take care to pass correct number.
111 * Exceptions are thrown directly from actual low-level call.
112 *<p>
113 * Note: only works for constructors and static methods.
114 */
115 public abstract Object call() throws Exception;
116
117 /**
118 * Method that can be used to (try to) call this object with specified arguments.
119 * This may succeed or fail, depending on expected number
120 * of arguments: caller needs to take care to pass correct number.
121 * Exceptions are thrown directly from actual low-level call.
122 *<p>
123 * Note: only works for constructors and static methods.
124 */
125 public abstract Object call(Object[] args) throws Exception;
126
127 /**
128 * Method that can be used to (try to) call this object with single arguments.
129 * This may succeed or fail, depending on expected number
130 * of arguments: caller needs to take care to pass correct number.
131 * Exceptions are thrown directly from actual low-level call.
132 *<p>
133 * Note: only works for constructors and static methods.
134 */
135 public abstract Object call1(Object arg) throws Exception;
136 }
137