package com.blazebit.cdi.exclude; import java.lang.reflect.Field; import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.inject.spi.AnnotatedField; import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.BeanManager; import org.apache.deltaspike.core.util.metadata.builder.ContextualLifecycle; public class ProducerFieldCreationalContext implements ContextualLifecycle<Object> { private final Bean<Object> declaringBean; private final Field field; private final BeanManager beanManager; public ProducerFieldCreationalContext(Bean<Object> declaringBean, AnnotatedField<?> field, BeanManager beanManager) { this.declaringBean = declaringBean; this.field = field.getJavaMember(); this.beanManager = beanManager; this.field.setAccessible(true); } @Override public Object create(Bean<Object> bean, CreationalContext<Object> creationalContext) { CreationalContext<?> cc = beanManager.createCreationalContext(null); Object o = beanManager.getReference(declaringBean, declaringBean.getBeanClass(), cc); try { return field.get(o); } catch (Exception e) { throw new RuntimeException("Could not retrieve the value from the producer field", e); } } @Override public void destroy(Bean<Object> bean, Object instance, CreationalContext<Object> creationalContext) { } }