• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 /**
9  * Object that represents method parameters, mostly so that associated
10  * annotations can be processed conveniently. Note that many of accessors
11  * cannot return meaningful values since parameters do not have stand-alone
12  * JDK objects associated; so access should mostly be limited to checking
13  * annotation values which are properly aggregated and included.
14  */
15 public final class AnnotatedParameter
16     extends AnnotatedMember
17 {
18     private static final long serialVersionUID = 1L;
19 
20     /**
21      * Member (method, constructor) that this parameter belongs to
22      */
23     protected final AnnotatedWithParams _owner;
24 
25     /**
26      * JDK type of the parameter, possibly contains generic type information
27      */
28     protected final JavaType _type;
29 
30     /**
31      * Index of the parameter within argument list
32      */
33     protected final int _index;
34 
35     /*
36     /**********************************************************
37     /* Life-cycle
38     /**********************************************************
39      */
40 
AnnotatedParameter(AnnotatedWithParams owner, JavaType type, TypeResolutionContext typeContext, AnnotationMap annotations, int index)41     public AnnotatedParameter(AnnotatedWithParams owner, JavaType type,
42             TypeResolutionContext typeContext,
43             AnnotationMap annotations, int index)
44     {
45         super(typeContext, annotations);
46         _owner = owner;
47         _type = type;
48         _index = index;
49     }
50 
51     @Override
withAnnotations(AnnotationMap ann)52     public AnnotatedParameter withAnnotations(AnnotationMap ann) {
53         if (ann == _annotations) {
54             return this;
55         }
56         return _owner.replaceParameterAnnotations(_index, ann);
57     }
58 
59     /*
60     /**********************************************************
61     /* Annotated impl
62     /**********************************************************
63      */
64 
65     /**
66      * Since there is no matching JDK element, this method will
67      * always return null
68      */
69     @Override
getAnnotated()70     public AnnotatedElement getAnnotated() { return null; }
71 
72     /**
73      * Returns modifiers of the constructor, as parameters do not
74      * have independent modifiers.
75      */
76     @Override
getModifiers()77     public int getModifiers() { return _owner.getModifiers(); }
78 
79     /**
80      * Parameters have no names in bytecode (unlike in source code),
81      * will always return empty String ("").
82      */
83     @Override
getName()84     public String getName() { return ""; }
85 
86     @Override
getRawType()87     public Class<?> getRawType() {
88         return _type.getRawClass();
89     }
90 
91     @Override
getType()92     public JavaType getType() {
93         return _type;
94     }
95 
96     /*
97     /**********************************************************
98     /* AnnotatedMember extras
99     /**********************************************************
100      */
101 
102     @Override
getDeclaringClass()103     public Class<?> getDeclaringClass() {
104         return _owner.getDeclaringClass();
105     }
106 
107     @Override
getMember()108     public Member getMember() {
109         // This is bit tricky: since there is no JDK equivalent; can either
110         // return null or owner... let's do latter, for now.
111         return _owner.getMember();
112     }
113 
114     @Override
setValue(Object pojo, Object value)115     public void setValue(Object pojo, Object value) throws UnsupportedOperationException
116     {
117         throw new UnsupportedOperationException("Cannot call setValue() on constructor parameter of "
118                 +getDeclaringClass().getName());
119     }
120 
121     @Override
getValue(Object pojo)122     public Object getValue(Object pojo) throws UnsupportedOperationException
123     {
124         throw new UnsupportedOperationException("Cannot call getValue() on constructor parameter of "
125                 +getDeclaringClass().getName());
126     }
127 
128     /*
129     /**********************************************************
130     /* Extended API
131     /**********************************************************
132      */
133 
getParameterType()134     public Type getParameterType() { return _type; }
135 
136     /**
137      * Accessor for 'owner' of this parameter; method or constructor that
138      * has this parameter as member of its argument list.
139      *
140      * @return Owner (member or creator) object of this parameter
141      */
getOwner()142     public AnnotatedWithParams getOwner() { return _owner; }
143 
144     /**
145      * Accessor for index of this parameter within argument list
146      *
147      * @return Index of this parameter within argument list
148      */
getIndex()149     public int getIndex() { return _index; }
150 
151     /*
152     /********************************************************
153     /* Other
154     /********************************************************
155      */
156 
157     @Override
hashCode()158     public int hashCode() {
159         return _owner.hashCode() + _index;
160     }
161 
162     @Override
equals(Object o)163     public boolean equals(Object o) {
164         if (o == this) return true;
165         if (!ClassUtil.hasClass(o, getClass())) {
166             return false;
167         }
168         AnnotatedParameter other = (AnnotatedParameter) o;
169         return other._owner.equals(_owner) && (other._index == _index);
170     }
171 
172     @Override
toString()173     public String toString() {
174         return "[parameter #"+getIndex()+", annotations: "+_annotations+"]";
175     }
176 }
177 
178