1
1
/*
2
- * Copyright 2002-2017 the original author or authors.
2
+ * Copyright 2002-2018 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
@@ -117,36 +117,35 @@ public class ResolvableType implements Serializable {
117
117
@ Nullable
118
118
private final ResolvableType componentType ;
119
119
120
- /**
121
- * Copy of the resolved value.
122
- */
123
120
@ Nullable
124
- private final Class <?> resolved ;
121
+ private final Integer hash ;
125
122
126
123
@ Nullable
127
- private final Integer hash ;
124
+ private Class <?> resolved ;
128
125
129
126
@ Nullable
130
- private ResolvableType superType ;
127
+ private volatile ResolvableType superType ;
131
128
132
129
@ Nullable
133
- private ResolvableType [] interfaces ;
130
+ private volatile ResolvableType [] interfaces ;
134
131
135
132
@ Nullable
136
- private ResolvableType [] generics ;
133
+ private volatile ResolvableType [] generics ;
137
134
138
135
139
136
/**
140
137
* Private constructor used to create a new {@link ResolvableType} for cache key purposes,
141
138
* with no upfront resolution.
142
139
*/
143
- private ResolvableType (Type type , @ Nullable TypeProvider typeProvider , @ Nullable VariableResolver variableResolver ) {
140
+ private ResolvableType (
141
+ Type type , @ Nullable TypeProvider typeProvider , @ Nullable VariableResolver variableResolver ) {
142
+
144
143
this .type = type ;
145
144
this .typeProvider = typeProvider ;
146
145
this .variableResolver = variableResolver ;
147
146
this .componentType = null ;
148
- this .resolved = null ;
149
147
this .hash = calculateHashCode ();
148
+ this .resolved = null ;
150
149
}
151
150
152
151
/**
@@ -161,8 +160,8 @@ private ResolvableType(Type type, @Nullable TypeProvider typeProvider,
161
160
this .typeProvider = typeProvider ;
162
161
this .variableResolver = variableResolver ;
163
162
this .componentType = null ;
164
- this .resolved = resolveClass ();
165
163
this .hash = hash ;
164
+ this .resolved = resolveClass ();
166
165
}
167
166
168
167
/**
@@ -176,8 +175,8 @@ private ResolvableType(Type type, @Nullable TypeProvider typeProvider,
176
175
this .typeProvider = typeProvider ;
177
176
this .variableResolver = variableResolver ;
178
177
this .componentType = componentType ;
179
- this .resolved = resolveClass ();
180
178
this .hash = null ;
179
+ this .resolved = resolveClass ();
181
180
}
182
181
183
182
/**
@@ -453,10 +452,12 @@ public ResolvableType getSuperType() {
453
452
if (resolved == null || resolved .getGenericSuperclass () == null ) {
454
453
return NONE ;
455
454
}
456
- if (this .superType == null ) {
457
- this .superType = forType (SerializableTypeWrapper .forGenericSuperclass (resolved ), asVariableResolver ());
455
+ ResolvableType superType = this .superType ;
456
+ if (superType == null ) {
457
+ superType = forType (SerializableTypeWrapper .forGenericSuperclass (resolved ), asVariableResolver ());
458
+ this .superType = superType ;
458
459
}
459
- return this . superType ;
460
+ return superType ;
460
461
}
461
462
462
463
/**
@@ -470,10 +471,12 @@ public ResolvableType[] getInterfaces() {
470
471
if (resolved == null || ObjectUtils .isEmpty (resolved .getGenericInterfaces ())) {
471
472
return EMPTY_TYPES_ARRAY ;
472
473
}
473
- if (this .interfaces == null ) {
474
- this .interfaces = forTypes (SerializableTypeWrapper .forGenericInterfaces (resolved ), asVariableResolver ());
474
+ ResolvableType [] interfaces = this .interfaces ;
475
+ if (interfaces == null ) {
476
+ interfaces = forTypes (SerializableTypeWrapper .forGenericInterfaces (resolved ), asVariableResolver ());
477
+ this .interfaces = interfaces ;
475
478
}
476
- return this . interfaces ;
479
+ return interfaces ;
477
480
}
478
481
479
482
/**
@@ -667,24 +670,25 @@ public ResolvableType[] getGenerics() {
667
670
if (this == NONE ) {
668
671
return EMPTY_TYPES_ARRAY ;
669
672
}
670
- if (this .generics == null ) {
673
+ ResolvableType [] generics = this .generics ;
674
+ if (generics == null ) {
671
675
if (this .type instanceof Class ) {
672
676
Class <?> typeClass = (Class <?>) this .type ;
673
- this . generics = forTypes (SerializableTypeWrapper .forTypeParameters (typeClass ), this .variableResolver );
677
+ generics = forTypes (SerializableTypeWrapper .forTypeParameters (typeClass ), this .variableResolver );
674
678
}
675
679
else if (this .type instanceof ParameterizedType ) {
676
680
Type [] actualTypeArguments = ((ParameterizedType ) this .type ).getActualTypeArguments ();
677
- ResolvableType [] generics = new ResolvableType [actualTypeArguments .length ];
681
+ generics = new ResolvableType [actualTypeArguments .length ];
678
682
for (int i = 0 ; i < actualTypeArguments .length ; i ++) {
679
683
generics [i ] = forType (actualTypeArguments [i ], this .variableResolver );
680
684
}
681
- this .generics = generics ;
682
685
}
683
686
else {
684
- this . generics = resolveType ().getGenerics ();
687
+ generics = resolveType ().getGenerics ();
685
688
}
689
+ this .generics = generics ;
686
690
}
687
- return this . generics ;
691
+ return generics ;
688
692
}
689
693
690
694
/**
@@ -748,7 +752,7 @@ public Class<?> resolveGeneric(int... indexes) {
748
752
*/
749
753
@ Nullable
750
754
public Class <?> resolve () {
751
- return ( this .resolved != null ? this . resolved : null ) ;
755
+ return this .resolved ;
752
756
}
753
757
754
758
/**
@@ -1372,7 +1376,9 @@ static ResolvableType forType(@Nullable Type type, @Nullable VariableResolver va
1372
1376
* @param variableResolver the variable resolver or {@code null}
1373
1377
* @return a {@link ResolvableType} for the specified {@link Type} and {@link VariableResolver}
1374
1378
*/
1375
- static ResolvableType forType (@ Nullable Type type , @ Nullable TypeProvider typeProvider , @ Nullable VariableResolver variableResolver ) {
1379
+ static ResolvableType forType (
1380
+ @ Nullable Type type , @ Nullable TypeProvider typeProvider , @ Nullable VariableResolver variableResolver ) {
1381
+
1376
1382
if (type == null && typeProvider != null ) {
1377
1383
type = SerializableTypeWrapper .forTypeProvider (typeProvider );
1378
1384
}
@@ -1390,13 +1396,14 @@ static ResolvableType forType(@Nullable Type type, @Nullable TypeProvider typePr
1390
1396
cache .purgeUnreferencedEntries ();
1391
1397
1392
1398
// Check the cache - we may have a ResolvableType which has been resolved before...
1393
- ResolvableType key = new ResolvableType (type , typeProvider , variableResolver );
1394
- ResolvableType resolvableType = cache .get (key );
1395
- if (resolvableType == null ) {
1396
- resolvableType = new ResolvableType (type , typeProvider , variableResolver , key .hash );
1397
- cache .put (resolvableType , resolvableType );
1398
- }
1399
- return resolvableType ;
1399
+ ResolvableType resultType = new ResolvableType (type , typeProvider , variableResolver );
1400
+ ResolvableType cachedType = cache .get (resultType );
1401
+ if (cachedType == null ) {
1402
+ cachedType = new ResolvableType (type , typeProvider , variableResolver , resultType .hash );
1403
+ cache .put (cachedType , cachedType );
1404
+ }
1405
+ resultType .resolved = cachedType .resolved ;
1406
+ return resultType ;
1400
1407
}
1401
1408
1402
1409
/**
0 commit comments