|
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