From 82167c74d570f188c5abf28f729c1bb8839eef62 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Thu, 20 Jul 2017 23:06:11 +0200 Subject: [PATCH] HV-1439 Avoid calling reflection methods multiple times --- .../provider/AnnotationMetaDataProvider.java | 45 +++++++++---------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/engine/src/main/java/org/hibernate/validator/internal/metadata/provider/AnnotationMetaDataProvider.java b/engine/src/main/java/org/hibernate/validator/internal/metadata/provider/AnnotationMetaDataProvider.java index 38741caa2a..a62fc40a61 100644 --- a/engine/src/main/java/org/hibernate/validator/internal/metadata/provider/AnnotationMetaDataProvider.java +++ b/engine/src/main/java/org/hibernate/validator/internal/metadata/provider/AnnotationMetaDataProvider.java @@ -324,12 +324,14 @@ private ConstrainedExecutable findExecutableMetaData(Executable executable) { cascadingMetaDataBuilder = CascadingMetaDataBuilder.nonCascading(); } else { - typeArgumentsConstraints = findTypeAnnotationConstraints( executable ); + AnnotatedType annotatedReturnType = executable.getAnnotatedReturnType(); + + typeArgumentsConstraints = findTypeAnnotationConstraints( executable, annotatedReturnType ); returnValueConstraints = convertToMetaConstraints( executableConstraints.get( ConstraintType.GENERIC ), executable ); - cascadingMetaDataBuilder = findCascadingMetaData( executable ); + cascadingMetaDataBuilder = findCascadingMetaData( executable, annotatedReturnType ); } return new ConstrainedExecutable( @@ -416,8 +418,10 @@ private List getParameterMetaData(Executable executable) { } } - Set> typeArgumentsConstraints = findTypeAnnotationConstraintsForExecutableParameter( executable, i ); - CascadingMetaDataBuilder cascadingMetaData = findCascadingMetaData( executable, i ); + AnnotatedType parameterAnnotatedType = parameter.getAnnotatedType(); + + Set> typeArgumentsConstraints = findTypeAnnotationConstraintsForExecutableParameter( executable, i, parameterAnnotatedType ); + CascadingMetaDataBuilder cascadingMetaData = findCascadingMetaData( executable, i, parameterAnnotatedType ); metaData.add( new ConstrainedParameter( @@ -492,8 +496,6 @@ protected List> findConstrain return Collections.emptyList(); } - List> constraintDescriptors = newArrayList(); - List constraints = newArrayList(); Class annotationType = annotation.annotationType(); if ( constraintHelper.isConstraintAnnotation( annotationType ) ) { @@ -503,13 +505,9 @@ else if ( constraintHelper.isMultiValueConstraint( annotationType ) ) { constraints.addAll( constraintHelper.getConstraintsFromMultiValueConstraint( annotation ) ); } - for ( Annotation constraint : constraints ) { - final ConstraintDescriptorImpl constraintDescriptor = buildConstraintDescriptor( - member, constraint, type - ); - constraintDescriptors.add( constraintDescriptor ); - } - return constraintDescriptors; + return constraints.stream() + .map( c -> buildConstraintDescriptor( member, c, type ) ) + .collect( Collectors.toList() ); } private Map, Class> getGroupConversions(AnnotatedElement annotatedElement) { @@ -580,20 +578,20 @@ protected Set> findTypeAnnotationConstraints(Field field) { /** * Finds type arguments constraints for method return values. */ - protected Set> findTypeAnnotationConstraints(Executable executable) { + protected Set> findTypeAnnotationConstraints(Executable executable, AnnotatedType annotatedReturnType) { return findTypeArgumentsConstraints( executable, new TypeArgumentReturnValueLocation( executable ), - executable.getAnnotatedReturnType() + annotatedReturnType ); } - private CascadingMetaDataBuilder findCascadingMetaData(Executable executable, int i) { + private CascadingMetaDataBuilder findCascadingMetaData(Executable executable, int i, AnnotatedType parameterAnnotatedType) { Parameter parameter = executable.getParameters()[i]; TypeVariable[] typeParameters = parameter.getType().getTypeParameters(); - AnnotatedType annotatedType = parameter.getAnnotatedType(); - Map, CascadingMetaDataBuilder> containerElementTypesCascadingMetaData = getTypeParametersCascadingMetadata( annotatedType, typeParameters ); + Map, CascadingMetaDataBuilder> containerElementTypesCascadingMetaData = getTypeParametersCascadingMetadata( parameterAnnotatedType, + typeParameters ); try { return getCascadingMetaData( ReflectionHelper.typeOf( parameter.getDeclaringExecutable(), i ), @@ -614,7 +612,7 @@ private CascadingMetaDataBuilder findCascadingMetaData(Field field) { return getCascadingMetaData( ReflectionHelper.typeOf( field ), field, containerElementTypesCascadingMetaData ); } - private CascadingMetaDataBuilder findCascadingMetaData(Executable executable) { + private CascadingMetaDataBuilder findCascadingMetaData(Executable executable, AnnotatedType annotatedReturnType) { TypeVariable[] typeParameters; if ( executable instanceof Method ) { @@ -623,9 +621,9 @@ private CascadingMetaDataBuilder findCascadingMetaData(Executable executable) { else { typeParameters = ( (Constructor) executable ).getDeclaringClass().getTypeParameters(); } - AnnotatedType annotatedType = executable.getAnnotatedReturnType(); - Map, CascadingMetaDataBuilder> containerElementTypesCascadingMetaData = getTypeParametersCascadingMetadata( annotatedType, typeParameters ); + Map, CascadingMetaDataBuilder> containerElementTypesCascadingMetaData = getTypeParametersCascadingMetadata( annotatedReturnType, + typeParameters ); return getCascadingMetaData( ReflectionHelper.typeOf( executable ), executable, containerElementTypesCascadingMetaData ); } @@ -703,13 +701,12 @@ else if ( annotatedType instanceof AnnotatedParameterizedType ) { * * @return a set of type arguments constraints, or an empty set if no constrained type arguments are found */ - protected Set> findTypeAnnotationConstraintsForExecutableParameter(Executable executable, int i) { - Parameter parameter = executable.getParameters()[i]; + protected Set> findTypeAnnotationConstraintsForExecutableParameter(Executable executable, int i, AnnotatedType parameterAnnotatedType) { try { return findTypeArgumentsConstraints( executable, new TypeArgumentExecutableParameterLocation( executable, i ), - parameter.getAnnotatedType() + parameterAnnotatedType ); } catch (ArrayIndexOutOfBoundsException ex) {