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 (int i = 0; i < fields.length; i++) { 026 Field field = fields[i]; 027 if (field.getType() == fieldClass) { 028 Object value = decorator.decorate(instance); 029 field.setAccessible(true); 030 try { 031 field.set(instance, value); 032 } catch (IllegalAccessException e) { 033 throw new PicoCompositionException(e); 034 } 035 } 036 } 037 return instance; 038 } 039 040 041 public String getDescriptor() { 042 return "FieldDecorated"; 043 } 044 045 public interface Decorator { 046 047 Object decorate(Object instance); 048 049 050 } 051 052 }