### Question:
DecoratorFactory { public <T, D extends Decorator<T>> D create(Class<T> type, Class<D> decorator, Class<?>[] argumentTypes, Object[] arguments) { try { return meta(type, decorator).newInstance(argumentTypes, arguments); } catch(Exception e) { throw Throwables.propagate(e); } } private  DecoratorFactory(DecoratorGenerator generator); static DecoratorFactory get(); D create(Class<T> type, Class<D> decorator, Class<?>[] argumentTypes, Object[] arguments); D create(Class<T> type, Class<D> decorator); Class<? extends D> implement(Class<T> type, Class<D> decorator);  }### Answer:
@Test public void delegateShadowedMethod() throws Exception { abstract class D implements J, I, Decorator<I> { @Override public I delegate() { return new C("yep", 123); } } J j = factory.create(I.class, D.class, new Class[]{DecoratorFactoryTest.class}, new Object[]{this}); assertEquals("yep", j.name()); }