1010
1111import com .jparams .object .builder .BuildStrategy ;
1212import com .jparams .object .builder .Context ;
13+ import com .jparams .object .builder .path .Path ;
1314import com .jparams .object .builder .type .Type ;
1415import com .jparams .object .builder .type .TypeMap ;
1516import com .jparams .object .builder .type .TypeResolver ;
@@ -85,7 +86,7 @@ private Object createInstanceWithConstructor(final Context context, final Constr
8586 for (int i = 0 ; i < constructor .getParameters ().length ; i ++)
8687 {
8788 final Parameter parameter = constructor .getParameters ()[i ];
88- final Type <?> type = TypeResolver .resolve ( parameter );
89+ final Type <?> type = TypeResolver .resolveParameterType ( context . getPath (), parameter );
8990 arguments [i ] = context .createChild (name + "[" + i + "]" , type );
9091 }
9192
@@ -131,19 +132,40 @@ private Object createInstanceWithFieldInjection(final Context context)
131132
132133 private void injectFields (final Object object , final Context context )
133134 {
134- for (final Field field : ObjectUtils .getFields (object .getClass ()))
135+ Path path = context .getPath ();
136+
137+ while (true )
135138 {
136- try
139+ final Class <?> clazz = path .getType ().getJavaType ();
140+
141+ for (final Field field : clazz .getDeclaredFields ())
137142 {
138- final Type <?> type = TypeResolver .resolve (field );
139- final Object instance = context .createChild (field .getName (), type );
140- field .setAccessible (true );
141- field .set (object , instance );
143+ if (Modifier .isStatic (field .getModifiers ()))
144+ {
145+ continue ;
146+ }
147+
148+ try
149+ {
150+ final Type <?> type = TypeResolver .resolveFieldType (path , field );
151+ final Object instance = context .createChild (field .getName (), type );
152+ field .setAccessible (true );
153+ field .set (object , instance );
154+ }
155+ catch (final Exception e )
156+ {
157+ context .logError ("Failed to inject field [" + field .getName () + "]" , e );
158+ }
142159 }
143- catch (final Exception e )
160+
161+ final Type <?> superClass = TypeResolver .resolveType (path , clazz .getGenericSuperclass ());
162+
163+ if (superClass == null )
144164 {
145- context . logError ( "Failed to inject field [" + field . getName () + "]" , e ) ;
165+ return ;
146166 }
167+
168+ path = new Path ("$super" , superClass , path );
147169 }
148170 }
149171}
0 commit comments