13
13
import static java .lang .String .format ;
14
14
import static java .util .Collections .synchronizedMap ;
15
15
import static java .util .stream .Collectors .toCollection ;
16
- import static java .util .stream .Collectors .toList ;
17
16
import static java .util .stream .Collectors .toSet ;
18
17
import static org .apiguardian .api .API .Status .DEPRECATED ;
19
18
import static org .apiguardian .api .API .Status .INTERNAL ;
44
43
import java .util .ArrayList ;
45
44
import java .util .Arrays ;
46
45
import java .util .Collections ;
46
+ import java .util .Comparator ;
47
47
import java .util .HashMap ;
48
48
import java .util .IdentityHashMap ;
49
49
import java .util .LinkedHashSet ;
@@ -1367,14 +1367,14 @@ private static void detectInnerClassCycle(Class<?> clazz) {
1367
1367
public static <T > Constructor <T > getDeclaredConstructor (Class <T > clazz ) {
1368
1368
Preconditions .notNull (clazz , "Class must not be null" );
1369
1369
try {
1370
- List < Constructor <?>> constructors = Arrays .stream (clazz .getDeclaredConstructors ())//
1370
+ Constructor <?>[] constructors = Arrays .stream (clazz .getDeclaredConstructors ())//
1371
1371
.filter (ctor -> !ctor .isSynthetic ())//
1372
- .collect ( toList () );
1372
+ .toArray ( Constructor []:: new );
1373
1373
1374
- Preconditions .condition (constructors .size () == 1 ,
1374
+ Preconditions .condition (constructors .length == 1 ,
1375
1375
() -> String .format ("Class [%s] must declare a single constructor" , clazz .getName ()));
1376
1376
1377
- return (Constructor <T >) constructors . get ( 0 ) ;
1377
+ return (Constructor <T >) constructors [ 0 ] ;
1378
1378
}
1379
1379
catch (Throwable t ) {
1380
1380
throw ExceptionUtils .throwAsUncheckedException (getUnderlyingCause (t ));
@@ -1444,26 +1444,26 @@ private static List<Field> findAllFieldsInHierarchy(Class<?> clazz, HierarchyTra
1444
1444
Preconditions .notNull (traversalMode , "HierarchyTraversalMode must not be null" );
1445
1445
1446
1446
// @formatter:off
1447
- List < Field > localFields = getDeclaredFields (clazz ).stream ()
1447
+ Field [] localFields = getDeclaredFields (clazz ).stream ()
1448
1448
.filter (field -> !field .isSynthetic ())
1449
- .collect ( toList () );
1450
- List < Field > superclassFields = getSuperclassFields (clazz , traversalMode ).stream ()
1451
- .filter (field -> ! isFieldShadowedByLocalFields (field , localFields ))
1452
- .collect ( toList () );
1453
- List < Field > interfaceFields = getInterfaceFields (clazz , traversalMode ).stream ()
1454
- .filter (field -> ! isFieldShadowedByLocalFields (field , localFields ))
1455
- .collect ( toList () );
1449
+ .toArray ( Field []:: new );
1450
+ Field [] superclassFields = getSuperclassFields (clazz , traversalMode ).stream ()
1451
+ .filter (field -> isNotShadowedByLocalFields (field , localFields ))
1452
+ .toArray ( Field []:: new );
1453
+ Field [] interfaceFields = getInterfaceFields (clazz , traversalMode ).stream ()
1454
+ .filter (field -> isNotShadowedByLocalFields (field , localFields ))
1455
+ .toArray ( Field []:: new );
1456
1456
// @formatter:on
1457
1457
1458
- List <Field > fields = new ArrayList <>();
1458
+ List <Field > fields = new ArrayList <>(superclassFields . length + interfaceFields . length + localFields . length );
1459
1459
if (traversalMode == TOP_DOWN ) {
1460
- fields .addAll (superclassFields );
1461
- fields .addAll (interfaceFields );
1460
+ Collections .addAll (fields , superclassFields );
1461
+ Collections .addAll (fields , interfaceFields );
1462
1462
}
1463
- fields .addAll (localFields );
1463
+ Collections .addAll (fields , localFields );
1464
1464
if (traversalMode == BOTTOM_UP ) {
1465
- fields .addAll (interfaceFields );
1466
- fields .addAll (superclassFields );
1465
+ Collections .addAll (fields , interfaceFields );
1466
+ Collections .addAll (fields , superclassFields );
1467
1467
}
1468
1468
return fields ;
1469
1469
}
@@ -1735,26 +1735,27 @@ private static List<Method> findAllMethodsInHierarchy(Class<?> clazz, HierarchyT
1735
1735
Preconditions .notNull (traversalMode , "HierarchyTraversalMode must not be null" );
1736
1736
1737
1737
// @formatter:off
1738
- List < Method > localMethods = getDeclaredMethods (clazz , traversalMode ).stream ()
1738
+ Method [] localMethods = getDeclaredMethods (clazz , traversalMode ).stream ()
1739
1739
.filter (method -> !method .isSynthetic ())
1740
- .collect ( toList () );
1741
- List < Method > superclassMethods = getSuperclassMethods (clazz , traversalMode ).stream ()
1742
- .filter (method -> ! isMethodOverriddenByLocalMethods (method , localMethods ))
1743
- .collect ( toList () );
1744
- List < Method > interfaceMethods = getInterfaceMethods (clazz , traversalMode ).stream ()
1745
- .filter (method -> ! isMethodOverriddenByLocalMethods (method , localMethods ))
1746
- .collect ( toList () );
1740
+ .toArray ( Method []:: new );
1741
+ Method [] superclassMethods = getSuperclassMethods (clazz , traversalMode ).stream ()
1742
+ .filter (method -> isNotOverriddenByLocalMethods (method , localMethods ))
1743
+ .toArray ( Method []:: new );
1744
+ Method [] interfaceMethods = getInterfaceMethods (clazz , traversalMode ).stream ()
1745
+ .filter (method -> isNotOverriddenByLocalMethods (method , localMethods ))
1746
+ .toArray ( Method []:: new );
1747
1747
// @formatter:on
1748
1748
1749
- List <Method > methods = new ArrayList <>();
1749
+ List <Method > methods = new ArrayList <>(
1750
+ superclassMethods .length + interfaceMethods .length + localMethods .length );
1750
1751
if (traversalMode == TOP_DOWN ) {
1751
- methods .addAll (superclassMethods );
1752
- methods .addAll (interfaceMethods );
1752
+ Collections .addAll (methods , superclassMethods );
1753
+ Collections .addAll (methods , interfaceMethods );
1753
1754
}
1754
- methods .addAll (localMethods );
1755
+ Collections .addAll (methods , localMethods );
1755
1756
if (traversalMode == BOTTOM_UP ) {
1756
- methods .addAll (interfaceMethods );
1757
- methods .addAll (superclassMethods );
1757
+ Collections .addAll (methods , interfaceMethods );
1758
+ Collections .addAll (methods , superclassMethods );
1758
1759
}
1759
1760
return methods ;
1760
1761
}
@@ -1835,21 +1836,18 @@ private static List<Method> getDefaultMethods(Class<?> clazz) {
1835
1836
}
1836
1837
1837
1838
private static List <Field > toSortedMutableList (Field [] fields ) {
1838
- // @formatter:off
1839
- return Arrays .stream (fields )
1840
- .sorted (ReflectionUtils ::defaultFieldSorter )
1841
- // Use toCollection() instead of toList() to ensure list is mutable.
1842
- .collect (toCollection (ArrayList ::new ));
1843
- // @formatter:on
1839
+ return toSortedMutableList (fields , ReflectionUtils ::defaultFieldSorter );
1844
1840
}
1845
1841
1846
1842
private static List <Method > toSortedMutableList (Method [] methods ) {
1847
- // @formatter:off
1848
- return Arrays .stream (methods )
1849
- .sorted (ReflectionUtils ::defaultMethodSorter )
1850
- // Use toCollection() instead of toList() to ensure list is mutable.
1851
- .collect (toCollection (ArrayList ::new ));
1852
- // @formatter:on
1843
+ return toSortedMutableList (methods , ReflectionUtils ::defaultMethodSorter );
1844
+ }
1845
+
1846
+ private static <T > List <T > toSortedMutableList (T [] items , Comparator <? super T > comparator ) {
1847
+ List <T > result = new ArrayList <>(items .length );
1848
+ Collections .addAll (result , items );
1849
+ result .sort (comparator );
1850
+ return result ;
1853
1851
}
1854
1852
1855
1853
/**
@@ -1882,21 +1880,21 @@ private static List<Method> getInterfaceMethods(Class<?> clazz, HierarchyTravers
1882
1880
for (Class <?> ifc : clazz .getInterfaces ()) {
1883
1881
1884
1882
// @formatter:off
1885
- List < Method > localInterfaceMethods = getMethods (ifc ).stream ()
1883
+ Method [] localInterfaceMethods = getMethods (ifc ).stream ()
1886
1884
.filter (m -> !isAbstract (m ))
1887
- .collect ( toList () );
1885
+ .toArray ( Method []:: new );
1888
1886
1889
- List < Method > superinterfaceMethods = getInterfaceMethods (ifc , traversalMode ).stream ()
1890
- .filter (method -> ! isMethodOverriddenByLocalMethods (method , localInterfaceMethods ))
1891
- .collect ( toList () );
1887
+ Method [] superinterfaceMethods = getInterfaceMethods (ifc , traversalMode ).stream ()
1888
+ .filter (method -> isNotOverriddenByLocalMethods (method , localInterfaceMethods ))
1889
+ .toArray ( Method []:: new );
1892
1890
// @formatter:on
1893
1891
1894
1892
if (traversalMode == TOP_DOWN ) {
1895
- allInterfaceMethods .addAll (superinterfaceMethods );
1893
+ Collections .addAll (allInterfaceMethods , superinterfaceMethods );
1896
1894
}
1897
- allInterfaceMethods .addAll (localInterfaceMethods );
1895
+ Collections .addAll (allInterfaceMethods , localInterfaceMethods );
1898
1896
if (traversalMode == BOTTOM_UP ) {
1899
- allInterfaceMethods .addAll (superinterfaceMethods );
1897
+ Collections .addAll (allInterfaceMethods , superinterfaceMethods );
1900
1898
}
1901
1899
}
1902
1900
return allInterfaceMethods ;
@@ -1905,20 +1903,21 @@ private static List<Method> getInterfaceMethods(Class<?> clazz, HierarchyTravers
1905
1903
private static List <Field > getInterfaceFields (Class <?> clazz , HierarchyTraversalMode traversalMode ) {
1906
1904
List <Field > allInterfaceFields = new ArrayList <>();
1907
1905
for (Class <?> ifc : clazz .getInterfaces ()) {
1908
- List <Field > localInterfaceFields = getFields (ifc );
1906
+ Field [] localInterfaceFields = ifc .getFields ();
1907
+ Arrays .sort (localInterfaceFields , ReflectionUtils ::defaultFieldSorter );
1909
1908
1910
1909
// @formatter:off
1911
- List < Field > superinterfaceFields = getInterfaceFields (ifc , traversalMode ).stream ()
1912
- .filter (field -> ! isFieldShadowedByLocalFields (field , localInterfaceFields ))
1913
- .collect ( toList () );
1910
+ Field [] superinterfaceFields = getInterfaceFields (ifc , traversalMode ).stream ()
1911
+ .filter (field -> isNotShadowedByLocalFields (field , localInterfaceFields ))
1912
+ .toArray ( Field []:: new );
1914
1913
// @formatter:on
1915
1914
1916
1915
if (traversalMode == TOP_DOWN ) {
1917
- allInterfaceFields .addAll (superinterfaceFields );
1916
+ Collections .addAll (allInterfaceFields , superinterfaceFields );
1918
1917
}
1919
- allInterfaceFields .addAll (localInterfaceFields );
1918
+ Collections .addAll (allInterfaceFields , localInterfaceFields );
1920
1919
if (traversalMode == BOTTOM_UP ) {
1921
- allInterfaceFields .addAll (superinterfaceFields );
1920
+ Collections .addAll (allInterfaceFields , superinterfaceFields );
1922
1921
}
1923
1922
}
1924
1923
return allInterfaceFields ;
@@ -1932,11 +1931,16 @@ private static List<Field> getSuperclassFields(Class<?> clazz, HierarchyTraversa
1932
1931
return findAllFieldsInHierarchy (superclass , traversalMode );
1933
1932
}
1934
1933
1935
- private static boolean isFieldShadowedByLocalFields (Field field , List < Field > localFields ) {
1934
+ private static boolean isNotShadowedByLocalFields (Field field , Field [] localFields ) {
1936
1935
if (useLegacySearchSemantics ) {
1937
- return localFields .stream ().anyMatch (local -> local .getName ().equals (field .getName ()));
1936
+ for (Field local : localFields ) {
1937
+ if (local .getName ().equals (field .getName ())) {
1938
+ return false ;
1939
+ }
1940
+ }
1941
+ return true ;
1938
1942
}
1939
- return false ;
1943
+ return true ;
1940
1944
}
1941
1945
1942
1946
private static List <Method > getSuperclassMethods (Class <?> clazz , HierarchyTraversalMode traversalMode ) {
@@ -1947,8 +1951,13 @@ private static List<Method> getSuperclassMethods(Class<?> clazz, HierarchyTraver
1947
1951
return findAllMethodsInHierarchy (superclass , traversalMode );
1948
1952
}
1949
1953
1950
- private static boolean isMethodOverriddenByLocalMethods (Method method , List <Method > localMethods ) {
1951
- return localMethods .stream ().anyMatch (local -> isMethodOverriddenBy (method , local ));
1954
+ private static boolean isNotOverriddenByLocalMethods (Method method , Method [] localMethods ) {
1955
+ for (Method local : localMethods ) {
1956
+ if (isMethodOverriddenBy (method , local )) {
1957
+ return false ;
1958
+ }
1959
+ }
1960
+ return true ;
1952
1961
}
1953
1962
1954
1963
private static boolean isMethodOverriddenBy (Method upper , Method lower ) {
0 commit comments