|
7 | 7 | package org.hibernate.validator.internal.properties.javabean; |
8 | 8 |
|
9 | 9 | import java.lang.annotation.Annotation; |
10 | | -import java.lang.invoke.MethodHandles; |
11 | 10 | import java.lang.reflect.AnnotatedType; |
12 | 11 | import java.lang.reflect.Executable; |
13 | 12 | import java.lang.reflect.Method; |
14 | 13 | import java.lang.reflect.Modifier; |
15 | 14 | import java.lang.reflect.Parameter; |
16 | 15 | import java.lang.reflect.Type; |
17 | | -import java.lang.reflect.TypeVariable; |
18 | 16 | import java.util.ArrayList; |
19 | 17 | import java.util.Collections; |
20 | 18 | import java.util.List; |
|
25 | 23 | import org.hibernate.validator.internal.util.ExecutableHelper; |
26 | 24 | import org.hibernate.validator.internal.util.ExecutableParameterNameProvider; |
27 | 25 | import org.hibernate.validator.internal.util.ReflectionHelper; |
28 | | -import org.hibernate.validator.internal.util.TypeHelper; |
29 | | -import org.hibernate.validator.internal.util.logging.Log; |
30 | | -import org.hibernate.validator.internal.util.logging.LoggerFactory; |
31 | 26 |
|
32 | 27 | /** |
33 | 28 | * @author Marko Bekhta |
34 | 29 | * @author Guillaume Smet |
35 | 30 | */ |
36 | 31 | public abstract class JavaBeanExecutable<T extends Executable> implements Callable, JavaBeanAnnotatedConstrainable { |
37 | 32 |
|
38 | | - private static final Log LOG = LoggerFactory.make( MethodHandles.lookup() ); |
39 | | - |
40 | 33 | protected final T executable; |
41 | 34 | private final Type typeForValidatorResolution; |
42 | 35 | private final boolean hasReturnValue; |
@@ -194,72 +187,12 @@ private static List<JavaBeanParameter> getParameters(Executable executable) { |
194 | 187 |
|
195 | 188 | Parameter[] parameterArray = executable.getParameters(); |
196 | 189 | Class<?>[] parameterTypes = executable.getParameterTypes(); |
197 | | - // getGenericParameterTypes() does not include either the synthetic or the implicit parameters so we need to be |
198 | | - // extra careful |
199 | | - Type[] genericParameterTypes = executable.getGenericParameterTypes(); |
200 | | - |
201 | | - if ( parameterTypes.length == genericParameterTypes.length ) { |
202 | | - // this is the simple case where both arrays are consistent |
203 | | - // we could do without it but at some point, the behavior of getGenericParameterTypes() might be changed in |
204 | | - // Java and we'd better be ready. |
205 | | - for ( int i = 0; i < parameterArray.length; i++ ) { |
206 | | - parameters.add( new JavaBeanParameter( i, parameterArray[i], parameterTypes[i], getErasedTypeIfTypeVariable( genericParameterTypes[i] ) ) ); |
207 | | - } |
208 | | - } |
209 | | - else { |
210 | | - // in this case, we have synthetic or implicit parameters |
211 | | - |
212 | | - // do we have the information about which parameter is synthetic/implicit? |
213 | | - // (this metadata is only included when classes are compiled with the '-parameters' flag) |
214 | | - boolean hasParameterModifierInfo = isAnyParameterCarryingMetadata( parameterArray ); |
215 | | - |
216 | | - if ( ! hasParameterModifierInfo ) { |
217 | | - LOG.missingParameterMetadataWithSyntheticOrImplicitParameters( executable ); |
218 | | - } |
219 | | - |
220 | | - int explicitlyDeclaredParameterIndex = 0; |
221 | | - |
222 | | - for ( int i = 0; i < parameterArray.length; i++ ) { |
223 | | - if ( explicitlyDeclaredParameterIndex < genericParameterTypes.length // we might already be out of the bounds of generic params array |
224 | | - && isExplicit( parameterArray[i] ) |
225 | | - && parameterTypesMatch( parameterTypes[i], genericParameterTypes[explicitlyDeclaredParameterIndex] ) ) { |
226 | | - // in this case we have a parameter that is present and matches ("most likely") to the one in the generic parameter types list |
227 | | - parameters.add( new JavaBeanParameter( i, parameterArray[i], parameterTypes[i], |
228 | | - getErasedTypeIfTypeVariable( genericParameterTypes[explicitlyDeclaredParameterIndex] ) ) ); |
229 | | - explicitlyDeclaredParameterIndex++; |
230 | | - } |
231 | | - else { |
232 | | - // in this case, the parameter is not present in genericParameterTypes, or the types doesn't match |
233 | | - parameters.add( new JavaBeanParameter( i, parameterArray[i], parameterTypes[i], parameterTypes[i] ) ); |
234 | | - } |
235 | | - } |
236 | | - } |
237 | | - |
238 | | - return CollectionHelper.toImmutableList( parameters ); |
239 | | - } |
240 | | - |
241 | | - private static boolean isAnyParameterCarryingMetadata(Parameter[] parameterArray) { |
242 | | - for ( Parameter parameter : parameterArray ) { |
243 | | - if ( parameter.isSynthetic() || parameter.isImplicit() ) { |
244 | | - return true; |
245 | | - } |
246 | | - } |
247 | | - return false; |
248 | | - } |
249 | | - |
250 | | - private static boolean parameterTypesMatch(Class<?> paramType, Type genericParamType) { |
251 | | - return TypeHelper.getErasedType( genericParamType ).equals( paramType ); |
252 | | - } |
| 190 | + AnnotatedType[] annotatedTypes = executable.getAnnotatedParameterTypes(); |
253 | 191 |
|
254 | | - private static boolean isExplicit(Parameter parameter) { |
255 | | - return !parameter.isSynthetic() && !parameter.isImplicit(); |
256 | | - } |
257 | | - |
258 | | - private static Type getErasedTypeIfTypeVariable(Type genericType) { |
259 | | - if ( genericType instanceof TypeVariable ) { |
260 | | - return TypeHelper.getErasedType( genericType ); |
| 192 | + for ( int i = 0; i < parameterArray.length; i++ ) { |
| 193 | + parameters.add( new JavaBeanParameter( i, parameterArray[i], parameterTypes[i], annotatedTypes[i] ) ); |
261 | 194 | } |
262 | 195 |
|
263 | | - return genericType; |
| 196 | + return CollectionHelper.toImmutableList( parameters ); |
264 | 197 | } |
265 | 198 | } |
0 commit comments