001 package org.picocontainer.behaviors; 002 003 import org.picocontainer.ComponentAdapter; 004 import org.picocontainer.PicoCompositionException; 005 import org.picocontainer.PicoContainer; 006 007 import java.lang.reflect.Field; 008 import java.lang.reflect.Type; 009 010 @SuppressWarnings("serial") 011 public class FieldDecorated extends AbstractBehavior { 012 private final Class<?> fieldClass; 013 private final Decorator decorator; 014 015 public FieldDecorated(ComponentAdapter delegate, Class<?> fieldClass, Decorator decorator) { 016 super(delegate); 017 this.fieldClass = fieldClass; 018 this.decorator = decorator; 019 } 020 021 public Object getComponentInstance(final PicoContainer container, Type into) 022 throws PicoCompositionException { 023 Object instance = super.getComponentInstance(container, into); 024 Field[] fields = instance.getClass().getDeclaredFields(); 025 for (Field field : fields) { 026 if (field.getType() == fieldClass) { 027 Object value = decorator.decorate(instance); 028 field.setAccessible(true); 029 try { 030 field.set(instance, value); 031 } catch (IllegalAccessException e) { 032 throw new PicoCompositionException(e); 033 } 034 } 035 } 036 return instance; 037 } 038 039 040 public String getDescriptor() { 041 return "FieldDecorated"; 042 } 043 044 public interface Decorator { 045 046 Object decorate(Object instance); 047 048 049 } 050 051 }