1
1
package io .javarig .generator ;
2
2
3
+ import io .javarig .util .GenericTypes ;
3
4
import io .javarig .ParameterizedTypeImpl ;
4
5
import io .javarig .RandomInstanceGenerator ;
5
6
import io .javarig .exception .AbstractClassInstantiationException ;
13
14
14
15
import java .lang .reflect .*;
15
16
import java .util .*;
17
+ import java .util .stream .Collectors ;
18
+ import java .util .stream .IntStream ;
16
19
17
20
import static io .javarig .util .Utils .getOwnOrInheritedFieldByName ;
18
21
21
24
@ Slf4j
22
25
public class ObjectGenerator extends TypeGenerator {
23
26
private static final String SETTER_PREFIX = "set" ;
24
- private Map <String ,Type > genericTypes = new HashMap <>();
27
+ private Map <String ,Type > genericTypesMap = new HashMap <>();
25
28
26
29
public ObjectGenerator (Type type , RandomInstanceGenerator randomInstanceGenerator ) {
27
30
super (type , randomInstanceGenerator );
28
31
}
29
32
30
33
@ Override
31
34
public Object generate () throws InstanceGenerationException {
32
- Class <?> objectClass = (Class <?>) getType ();
35
+ Type objectType = getType ();
36
+ Class <?> objectClass ;
37
+ if (objectType instanceof ParameterizedType parameterizedType ){
38
+ objectClass = (Class <?>) parameterizedType .getRawType ();
39
+ constructGenericTypesMap (objectClass , parameterizedType );
40
+ } else {
41
+ objectClass = (Class <?>) objectType ;
42
+ }
33
43
Object generatedObject = getNewObjectInstance (objectClass );
34
44
log .info ("generating object of type {} ..." , objectClass .getName ());
35
45
generateFields (generatedObject , objectClass );
36
46
log .info ("created object {}" , generatedObject );
37
47
return generatedObject ;
38
48
}
39
49
50
+ private void constructGenericTypesMap (Class <?> objectClass , ParameterizedType parameterizedType ) {
51
+ List <Type > typeParametersValues = Arrays .asList (parameterizedType .getActualTypeArguments ());
52
+ List <String > typeParametersKeys = Arrays .stream (objectClass .getTypeParameters ())
53
+ .map (TypeVariable ::getTypeName )
54
+ .toList ();
55
+ genericTypesMap = IntStream .range (0 , typeParametersKeys .size ())
56
+ .boxed ()
57
+ .collect (Collectors .toMap (typeParametersKeys ::get , typeParametersValues ::get ));
58
+ }
59
+
40
60
private void generateFields (Object generatedObject , Class <?> objectClass ) throws InstanceGenerationException {
41
61
List <Method > setters = getSetters (objectClass );
42
62
setters .forEach ((setter ) -> generateFieldWithSetter (generatedObject , objectClass , setter ));
@@ -63,7 +83,7 @@ private void generateField(Object generatedObject, Method setter, Field field) t
63
83
if (type instanceof ParameterizedType parameterizedType ){
64
84
type = setTypeArguments (parameterizedType );
65
85
}
66
- Object generatedField = getRandomInstanceGenerator ().generate (type );
86
+ Object generatedField = getRandomInstanceGenerator ().generate (GenericTypes . resolve ( type , genericTypesMap ) );
67
87
try {
68
88
setter .invoke (generatedObject , generatedField );
69
89
} catch (IllegalAccessException ignore ) {
@@ -76,13 +96,13 @@ private void generateField(Object generatedObject, Method setter, Field field) t
76
96
}
77
97
78
98
private Type setTypeArguments (Type type ) {
79
- List <Type > typeArguments = new ArrayList <>();
80
99
ParameterizedType parameterizedType = (ParameterizedType ) type ;
81
- for ( Type typeArgument : parameterizedType .getActualTypeArguments ()){
82
- typeArguments . add ( genericTypes . getOrDefault (typeArgument . getTypeName (), typeArgument ));
83
- }
100
+ List < Type > typeArguments = Arrays . stream ( parameterizedType .getActualTypeArguments ())
101
+ . map ( (typeArgument -> GenericTypes . resolve ( typeArgument , genericTypesMap )))
102
+ . toList ();
84
103
Type [] typeArgumentsArray = new Type [typeArguments .size ()];
85
- return new ParameterizedTypeImpl (typeArguments .toArray (typeArgumentsArray ), (Class <?>) ((ParameterizedType ) type ).getRawType ());
104
+ return new ParameterizedTypeImpl (typeArguments .toArray (typeArgumentsArray ),
105
+ (Class <?>) ((ParameterizedType ) type ).getRawType ());
86
106
}
87
107
88
108
private Object getNewObjectInstance (Class <?> objectClass ) throws InstanceGenerationException {
0 commit comments