From 2209e7cb9201d2fa3fe265d98b4dd5dd2db462fc Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 24 Mar 2020 00:08:43 +0100 Subject: [PATCH] Reuse empty class array constant in ClassUtils Closes gh-24221 --- .../org/springframework/util/ClassUtils.java | 18 ++++++++---------- .../orm/jpa/ExtendedEntityManagerCreator.java | 7 +++---- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/util/ClassUtils.java b/spring-core/src/main/java/org/springframework/util/ClassUtils.java index 91a74aa3f8..f591e20d90 100644 --- a/spring-core/src/main/java/org/springframework/util/ClassUtils.java +++ b/spring-core/src/main/java/org/springframework/util/ClassUtils.java @@ -65,6 +65,9 @@ public abstract class ClassUtils { /** Prefix for internal non-primitive array class names: {@code "[L"}. */ private static final String NON_PRIMITIVE_ARRAY_PREFIX = "[L"; + /** A reusable empty class array constant. */ + private static final Class[] EMPTY_CLASS_ARRAY = {}; + /** The package separator character: {@code '.'}. */ private static final char PACKAGE_SEPARATOR = '.'; @@ -543,17 +546,12 @@ public abstract class ClassUtils { } if (lhsType.isPrimitive()) { Class resolvedPrimitive = primitiveWrapperTypeMap.get(rhsType); - if (lhsType == resolvedPrimitive) { - return true; - } + return (lhsType == resolvedPrimitive); } else { Class resolvedWrapper = primitiveTypeToWrapperMap.get(rhsType); - if (resolvedWrapper != null && lhsType.isAssignableFrom(resolvedWrapper)) { - return true; - } + return (resolvedWrapper != null && lhsType.isAssignableFrom(resolvedWrapper)); } - return false; } /** @@ -681,8 +679,8 @@ public abstract class ClassUtils { * @since 3.1 * @see StringUtils#toStringArray */ - public static Class[] toClassArray(Collection> collection) { - return collection.toArray(new Class[0]); + public static Class[] toClassArray(@Nullable Collection> collection) { + return (!CollectionUtils.isEmpty(collection) ? collection.toArray(EMPTY_CLASS_ARRAY) : EMPTY_CLASS_ARRAY); } /** @@ -1062,7 +1060,7 @@ public abstract class ClassUtils { * @param clazz the clazz to analyze * @param paramTypes the parameter types of the method * @return whether the class has a corresponding constructor - * @see Class#getMethod + * @see Class#getConstructor */ public static boolean hasConstructor(Class clazz, Class... paramTypes) { return (getConstructorIfAvailable(clazz, paramTypes) != null); diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/ExtendedEntityManagerCreator.java b/spring-orm/src/main/java/org/springframework/orm/jpa/ExtendedEntityManagerCreator.java index 5840646ac4..00364fb0f4 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/ExtendedEntityManagerCreator.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/ExtendedEntityManagerCreator.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -232,7 +232,7 @@ public abstract class ExtendedEntityManagerCreator { if (emIfc != null) { interfaces = cachedEntityManagerInterfaces.computeIfAbsent(emIfc, key -> { - Set> ifcs = new LinkedHashSet<>(); + Set> ifcs = new LinkedHashSet<>(4); ifcs.add(key); ifcs.add(EntityManagerProxy.class); return ClassUtils.toClassArray(ifcs); @@ -240,8 +240,7 @@ public abstract class ExtendedEntityManagerCreator { } else { interfaces = cachedEntityManagerInterfaces.computeIfAbsent(rawEm.getClass(), key -> { - Set> ifcs = new LinkedHashSet<>(ClassUtils - .getAllInterfacesForClassAsSet(key, cl)); + Set> ifcs = new LinkedHashSet<>(ClassUtils.getAllInterfacesForClassAsSet(key, cl)); ifcs.add(EntityManagerProxy.class); return ClassUtils.toClassArray(ifcs); });