From 9b3dd05baaea788283473302db096f8caa83f212 Mon Sep 17 00:00:00 2001 From: Christoph Dreis Date: Fri, 2 Dec 2016 12:26:14 +0100 Subject: [PATCH] DATACMNS-867 - Avoid allocations from Method.getParameterTypes() where possible. We now prefer an explicit Method.getParameterCount() over accessing the parameter types array and its length to avoid the overhead of cloning the array. Original pull request: #187. --- .../core/support/DefaultRepositoryInformation.java | 2 +- .../core/support/ReactiveRepositoryInformation.java | 2 +- .../springframework/data/repository/query/spi/Function.java | 6 +++--- .../data/repository/support/MethodParameters.java | 2 +- .../repository/support/ReflectionRepositoryInvoker.java | 3 +-- .../model/ClassGeneratingPropertyAccessorFactoryTests.java | 2 +- 6 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryInformation.java b/src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryInformation.java index 0aeaaed53..90061f827 100644 --- a/src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryInformation.java +++ b/src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryInformation.java @@ -246,7 +246,7 @@ class DefaultRepositoryInformation implements RepositoryInformation { Supplier> detailedComparison = () -> baseClass.flatMap(it -> Arrays.stream(it.getMethods())// .filter(baseClassMethod -> method.getName().equals(baseClassMethod.getName()))// Right name - .filter(baseClassMethod -> method.getParameterTypes().length == baseClassMethod.getParameterTypes().length) + .filter(baseClassMethod -> method.getParameterCount() == baseClassMethod.getParameterCount()) .filter(baseClassMethod -> parametersMatch(method, baseClassMethod))// All parameters match .findFirst()); diff --git a/src/main/java/org/springframework/data/repository/core/support/ReactiveRepositoryInformation.java b/src/main/java/org/springframework/data/repository/core/support/ReactiveRepositoryInformation.java index a94c8b37b..916fd5893 100644 --- a/src/main/java/org/springframework/data/repository/core/support/ReactiveRepositoryInformation.java +++ b/src/main/java/org/springframework/data/repository/core/support/ReactiveRepositoryInformation.java @@ -163,7 +163,7 @@ public class ReactiveRepositoryInformation extends DefaultRepositoryInformation return Arrays.stream(baseClass.getMethods())// .filter(it -> method.getName().equals(it.getName()))// - .filter(it -> method.getParameterTypes().length == it.getParameterTypes().length)// + .filter(it -> method.getParameterCount() == it.getParameterCount())// .filter(it -> parametersMatch(it, method, predicate))// .findFirst(); } diff --git a/src/main/java/org/springframework/data/repository/query/spi/Function.java b/src/main/java/org/springframework/data/repository/query/spi/Function.java index 54b9d1d1e..84f8ff676 100644 --- a/src/main/java/org/springframework/data/repository/query/spi/Function.java +++ b/src/main/java/org/springframework/data/repository/query/spi/Function.java @@ -101,12 +101,12 @@ public class Function { */ public boolean supports(List argumentTypes) { - Class[] parameterTypes = method.getParameterTypes(); - - if (parameterTypes.length != argumentTypes.size()) { + if (method.getParameterCount() != argumentTypes.size()) { return false; } + Class[] parameterTypes = method.getParameterTypes(); + for (int i = 0; i < parameterTypes.length; i++) { if (!TypeUtils.isAssignable(parameterTypes[i], argumentTypes.get(i).getType())) { return false; diff --git a/src/main/java/org/springframework/data/repository/support/MethodParameters.java b/src/main/java/org/springframework/data/repository/support/MethodParameters.java index 252ef1c95..25540b745 100644 --- a/src/main/java/org/springframework/data/repository/support/MethodParameters.java +++ b/src/main/java/org/springframework/data/repository/support/MethodParameters.java @@ -60,7 +60,7 @@ class MethodParameters { Assert.notNull(method, "Method must not be null!"); this.parameters = new ArrayList<>(); - for (int i = 0; i < method.getParameterTypes().length; i++) { + for (int i = 0; i < method.getParameterCount(); i++) { MethodParameter parameter = new AnnotationNamingMethodParameter(method, i, namingAnnotation); parameter.initParameterNameDiscovery(discoverer); diff --git a/src/main/java/org/springframework/data/repository/support/ReflectionRepositoryInvoker.java b/src/main/java/org/springframework/data/repository/support/ReflectionRepositoryInvoker.java index a0d8980b4..f366b685f 100644 --- a/src/main/java/org/springframework/data/repository/support/ReflectionRepositoryInvoker.java +++ b/src/main/java/org/springframework/data/repository/support/ReflectionRepositoryInvoker.java @@ -283,9 +283,8 @@ class ReflectionRepositoryInvoker implements RepositoryInvoker { Method method = methods.getFindAllMethod() .orElseThrow(() -> new IllegalStateException("Repository doesn't have a find-all-method declared!")); - Class[] types = method.getParameterTypes(); - if (types.length == 0) { + if (method.getParameterCount() == 0) { return invoke(method); } diff --git a/src/test/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests.java b/src/test/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests.java index 13d38d8d1..e1755f2c9 100755 --- a/src/test/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests.java +++ b/src/test/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactoryTests.java @@ -116,7 +116,7 @@ public class ClassGeneratingPropertyAccessorFactoryTests { Constructor[] declaredConstructors = persistentPropertyAccessor.getClass().getDeclaredConstructors(); assertThat(declaredConstructors.length).isEqualTo(1); - assertThat(declaredConstructors[0].getParameterTypes().length).isEqualTo(1); + assertThat(declaredConstructors[0].getParameterCount()).isEqualTo(1); assertThat(declaredConstructors[0].getParameterTypes()[0]).isEqualTo(expectedConstructorType); }