public static <T> ProvidableClass<T> wrap(InjectableDataExtractor extractor, Class<T> targetClazz ) { return new ProvidableClass<T>( targetClazz, readClassProvidableFields( extractor, targetClazz ), readPostConstructor( targetClazz ) ); }
public void postConstruct() { structure.postConstructor().accept( instance ); } }
public ProvidableClass<?> retrieveProvidableClass( final Class<?> targetClazz ) { ProvidableClass<?> providableClass = providableClassCache.get( targetClazz ); if ( providableClass == null ) synchronized ( providableClassCache ) { providableClass = providableClassCache.get( targetClazz ); if ( providableClass == null ) { providableClass = ProvidableClass.wrap( qualifierExtractor, targetClazz ); providableClassCache.put( targetClazz, providableClass ); } } return providableClass; }
static Iterable<ProvidableField> readClassProvidableFields(InjectableDataExtractor extractor, Class<?> targetClazz ) { final List<ProvidableField> providableFields = new TinyList<>(); Class<? extends Object> clazz = targetClazz; while ( !Object.class.equals( clazz ) ) { populateWithProvidableFields( extractor, clazz, providableFields ); if ( clazz.isAnnotationPresent( GeneratedFromStatelessService.class ) ) break; clazz = clazz.getSuperclass(); } return providableFields; }
private void tryInjectFields( Object obj, final ProvidableClass<?> providableClass ) { for ( final ProvidableField field : providableClass.fields() ) try { field.provide( obj, this ); } catch ( final Throwable e ) { log.debug( e.getMessage(), e ); fieldToTryToInjectAgainLater.add( new InjectableField( field, obj ) ); } }
static void populateWithProvidableFields(InjectableDataExtractor extractor, Class<?> targetClazz, List<ProvidableField> providableFields ) { for ( final Field field : targetClazz.getDeclaredFields() ) { final Collection<Class<? extends Annotation>> qualifiers = extractQualifiersAvoidingNPEWhenCreatingQualifierExtractorFrom( extractor, field ); if ( extractor.isAManyElementsProvider( field ) ) providableFields.add( ManyElementsProvidableField.from( qualifiers, field ) ); else if ( extractor.isASingleElementProvider( field ) ) providableFields.add( SingleElementProvidableField.from( qualifiers, field ) ); } }