Skip to content

Commit 34aea35

Browse files
committed
Polishing.
Introduce common exclusion rules for constructors. See: #2744 Original pull request: #2746
1 parent f9505c3 commit 34aea35

File tree

2 files changed

+56
-22
lines changed

2 files changed

+56
-22
lines changed

src/main/java/org/springframework/data/util/Predicates.java

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.springframework.data.util;
1717

18+
import java.lang.reflect.Constructor;
1819
import java.lang.reflect.Member;
1920
import java.lang.reflect.Method;
2021
import java.lang.reflect.Modifier;
@@ -30,22 +31,24 @@
3031
*/
3132
public interface Predicates {
3233

33-
public static final Predicate<Member> IS_ENUM_MEMBER = member -> member.getDeclaringClass().isEnum();
34-
public static final Predicate<Member> IS_HIBERNATE_MEMBER = member -> member.getName().startsWith("$$_hibernate"); // this
34+
Predicate<Member> IS_ENUM_MEMBER = member -> member.getDeclaringClass().isEnum();
35+
Predicate<Member> IS_HIBERNATE_MEMBER = member -> member.getName().startsWith("$$_hibernate"); // this
3536
// should
3637
// go
3738
// into
3839
// JPA
39-
public static final Predicate<Member> IS_OBJECT_MEMBER = member -> Object.class.equals(member.getDeclaringClass());
40-
public static final Predicate<Member> IS_JAVA = member -> member.getDeclaringClass().getPackageName().startsWith("java.");
41-
public static final Predicate<Member> IS_NATIVE = member -> Modifier.isNative(member.getModifiers());
42-
public static final Predicate<Member> IS_PRIVATE = member -> Modifier.isPrivate(member.getModifiers());
43-
public static final Predicate<Member> IS_PROTECTED = member -> Modifier.isProtected(member.getModifiers());
44-
public static final Predicate<Member> IS_PUBLIC = member -> Modifier.isPublic(member.getModifiers());
45-
public static final Predicate<Member> IS_SYNTHETIC = Member::isSynthetic;
46-
public static final Predicate<Member> IS_STATIC = member -> Modifier.isStatic(member.getModifiers());
40+
Predicate<Member> IS_OBJECT_MEMBER = member -> Object.class.equals(member.getDeclaringClass());
41+
Predicate<Member> IS_JAVA = member -> member.getDeclaringClass().getPackageName().startsWith("java.");
42+
Predicate<Member> IS_NATIVE = member -> Modifier.isNative(member.getModifiers());
43+
Predicate<Member> IS_PRIVATE = member -> Modifier.isPrivate(member.getModifiers());
44+
Predicate<Member> IS_PROTECTED = member -> Modifier.isProtected(member.getModifiers());
45+
Predicate<Member> IS_PUBLIC = member -> Modifier.isPublic(member.getModifiers());
46+
Predicate<Member> IS_SYNTHETIC = Member::isSynthetic;
4747

48-
public static final Predicate<Method> IS_BRIDGE_METHOD = Method::isBridge;
48+
Predicate<Class<?>> IS_KOTLIN = KotlinReflectionUtils::isSupportedKotlinClass;
49+
Predicate<Member> IS_STATIC = member -> Modifier.isStatic(member.getModifiers());
50+
51+
Predicate<Method> IS_BRIDGE_METHOD = Method::isBridge;
4952

5053
/**
5154
* A {@link Predicate} that yields always {@code true}.
@@ -75,4 +78,29 @@ static <T> Predicate<T> negate(Predicate<T> predicate) {
7578
Assert.notNull(predicate, "Predicate must not be null");
7679
return predicate.negate();
7780
}
81+
82+
/**
83+
* Whether to consider a {@link Constructor}. We generally exclude synthetic constructors for non-Kotlin classes.
84+
*
85+
* @param candidate
86+
* @return
87+
*/
88+
static boolean isIncluded(Constructor<?> candidate) {
89+
return !isExcluded(candidate);
90+
}
91+
92+
/**
93+
* Whether to not consider a {@link Constructor}. We generally exclude synthetic constructors for non-Kotlin classes.
94+
*
95+
* @param candidate
96+
* @return
97+
*/
98+
static boolean isExcluded(Constructor<?> candidate) {
99+
100+
if (IS_KOTLIN.test(candidate.getDeclaringClass())) {
101+
return false;
102+
}
103+
104+
return IS_SYNTHETIC.test(candidate);
105+
}
78106
}

src/main/java/org/springframework/data/util/TypeCollector.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,7 @@
2020
import java.lang.reflect.Member;
2121
import java.lang.reflect.Method;
2222
import java.lang.reflect.Type;
23-
import java.util.ArrayList;
24-
import java.util.Arrays;
25-
import java.util.Collection;
26-
import java.util.Collections;
27-
import java.util.HashSet;
28-
import java.util.LinkedHashMap;
29-
import java.util.LinkedHashSet;
30-
import java.util.List;
31-
import java.util.Map;
32-
import java.util.Set;
23+
import java.util.*;
3324
import java.util.function.Consumer;
3425
import java.util.function.Predicate;
3526

@@ -40,9 +31,15 @@
4031
import org.springframework.util.ReflectionUtils;
4132

4233
/**
34+
* Collector to inspect domain types and discover the type graph that is relevant for Spring Data operations.
35+
* <p>
36+
* Type inspection walks through all class members (fields, methods, constructors) and introspects those for additional
37+
* types that are part of the domain model.
38+
*
4339
* @author Christoph Strobl
4440
* @author Sebastien Deleuze
4541
* @author John Blum
42+
* @since 3.0
4643
*/
4744
public class TypeCollector {
4845

@@ -122,13 +119,16 @@ private void processType(ResolvableType type, InspectionCache cache, Consumer<Re
122119
}
123120

124121
Set<Type> visitConstructorsOfType(ResolvableType type) {
122+
125123
if (!typeFilter.test(type.toClass())) {
126124
return Collections.emptySet();
127125
}
126+
128127
Set<Type> discoveredTypes = new LinkedHashSet<>();
128+
129129
for (Constructor<?> constructor : type.toClass().getDeclaredConstructors()) {
130130

131-
if (constructor.isSynthetic()) {
131+
if (Predicates.isExcluded(constructor)) {
132132
continue;
133133
}
134134
for (Class<?> signatureType : TypeUtils.resolveTypesInSignature(type.toClass(), constructor)) {
@@ -137,10 +137,12 @@ Set<Type> visitConstructorsOfType(ResolvableType type) {
137137
}
138138
}
139139
}
140+
140141
return new HashSet<>(discoveredTypes);
141142
}
142143

143144
Set<Type> visitMethodsOfType(ResolvableType type) {
145+
144146
if (!typeFilter.test(type.toClass())) {
145147
return Collections.emptySet();
146148
}
@@ -160,11 +162,14 @@ Set<Type> visitMethodsOfType(ResolvableType type) {
160162
} catch (Exception cause) {
161163
logger.warn(cause);
162164
}
165+
163166
return new HashSet<>(discoveredTypes);
164167
}
165168

166169
Set<Type> visitFieldsOfType(ResolvableType type) {
170+
167171
Set<Type> discoveredTypes = new LinkedHashSet<>();
172+
168173
ReflectionUtils.doWithLocalFields(type.toClass(), field -> {
169174
if (!fieldFilter.test(field)) {
170175
return;
@@ -175,6 +180,7 @@ Set<Type> visitFieldsOfType(ResolvableType type) {
175180
}
176181
}
177182
});
183+
178184
return discoveredTypes;
179185
}
180186

0 commit comments

Comments
 (0)