CglibKitchen

From SPA Wiki

Jump to: navigation, search

So we all ended up working on the same problem - how to get the following test to pass.

   @Test public void blockTest() throws IOException {        
       final String output = "hello people";
       openForWrite(new File("del.txt"), 
           new Block<File Output Stream>() Template:Arg(0).write(output.getBytes()););
   }

Our successful JBoss AOP solution involved intercepting

  < aop >
     < bind pointcut="execution($instanceof{Block}->new(..))">
         <interceptor class="ConstructorInterceptor"/>
     </bind>
  < /aop >

Skipping the constructor by use of Objenisis

public class ConstructorInterceptor implements Interceptor
{
   Objenesis objenesis = new ObjenesisStd(); // or ObjenesisSerializer


   public String getName() { return "ConstructorInterceptor"; }
  public Object invoke(Invocation invocation) throws Throwable
  {
    ConstructorInvocation mi = (ConstructorInvocation)invocation;
    Object[] args = mi.getArguments();
    Object[] args2 = (Object[]) args[ 1];
    if (args2.length != 0)
        return invocation.invokeNext();
    else {
        ObjectInstantiator thingyInstantiator = objenesis.getInstantiatorOf(mi.getConstructor().getDeclaringClass());
        Object result = thingyInstantiator.newInstance();
        return result;
    }
  }

}

and then

   public void openForWrite(File f, Block<FileOutputStream> b) throws IOException {
       FileOutputStream os = new FileOutputStream(f);
       try {
           invokeBlock(b.getClass(), os);
       } catch (IOException x) {
           throw x;
       } catch (Throwable e) {
           throw new RuntimeException(e);
       } finally {
           os.close();
       }        
   }
   @SuppressWarnings("unchecked")
   private static void invokeBlock(Class c, Object...args) throws Throwable {
       try {
           Constructor[] constructors = c.getDeclaredConstructors();
           constructors[0].newInstance(null, args);
       } catch (InvocationTargetException e) {
           throw e.getTargetException();
       } catch (Exception e) {
           throw new RuntimeException(e);
       }
   }