private FieldSetter createInjector( Class<?> cls, Field field ) throws ProcedureException { try { ComponentRegistry.Provider<?> provider = components.providerFor( field.getType() ); if ( provider == null ) { throw new ComponentInjectionException( Status.Procedure.ProcedureRegistrationFailed, "Unable to set up injection for procedure `%s`, the field `%s` " + "has type `%s` which is not a known injectable component.", cls.getSimpleName(), field.getName(), field.getType() ); } MethodHandle setter = MethodHandles.lookup().unreflectSetter( field ); return new FieldSetter( field, setter, provider ); } catch ( IllegalAccessException e ) { throw new ProcedureException( Status.Procedure.ProcedureRegistrationFailed, "Unable to set up injection for `%s`, failed to access field `%s`: %s", e, cls.getSimpleName(), field.getName(), e.getMessage() ); } }
private FieldSetter createInjector( Class<?> cls, Field field ) throws ProcedureException { try { ComponentRegistry.Provider<?> provider = components.providerFor( field.getType() ); if ( provider == null ) { throw new ComponentInjectionException( Status.Procedure.ProcedureRegistrationFailed, "Unable to set up injection for procedure `%s`, the field `%s` " + "has type `%s` which is not a known injectable component.", cls.getSimpleName(), field.getName(), field.getType() ); } MethodHandle setter = MethodHandles.lookup().unreflectSetter( field ); return new FieldSetter( field, setter, provider ); } catch ( IllegalAccessException e ) { throw new ProcedureException( Status.Procedure.ProcedureRegistrationFailed, "Unable to set up injection for `%s`, failed to access field `%s`: %s", e, cls.getSimpleName(), field.getName(), e.getMessage() ); } }
protected void inject( Context ctx, Object object ) throws ProcedureException { for ( FieldInjections.FieldSetter setter : fieldSetters ) { setter.apply( ctx, object ); } }
@Test public void inheritanceIsAllowed() throws Throwable { // Given ComponentRegistry components = new ComponentRegistry(); components.register( int.class, ctx -> 1337 ); FieldInjections injections = new FieldInjections( components ); // When List<FieldInjections.FieldSetter> setters = injections.setters( ChildProcedure.class ); // Then ChildProcedure childProcedure = new ChildProcedure(); for ( FieldInjections.FieldSetter setter : setters ) { setter.apply( null, childProcedure ); } assertEquals( 1337, childProcedure.childField ); assertEquals( 1337, childProcedure.parentField ); }
@Test public void syntheticsAllowed() throws Throwable { // Given ComponentRegistry components = new ComponentRegistry(); components.register( int.class, ctx -> 1337 ); FieldInjections injections = new FieldInjections( components ); // When List<FieldInjections.FieldSetter> setters = injections.setters( Outer.ClassWithSyntheticField.class ); // Then Outer.ClassWithSyntheticField syntheticField = new Outer().classWithSyntheticField(); for ( FieldInjections.FieldSetter setter : setters ) { setter.apply( null, syntheticField ); } assertEquals( 1337, syntheticField.innerField ); }
protected void inject( Context ctx, Object object ) throws ProcedureException { for ( FieldInjections.FieldSetter setter : fieldSetters ) { setter.apply( ctx, object ); } }