MentaContainer

Rev

Rev 141 | Rev 143 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package org.mentacontainer.impl;

import java.lang.reflect.Method;

import org.mentacontainer.Creator;
import org.mentacontainer.util.FindMethod;

public class GenericFactory<E> implements Creator<E> {
       
        private final Object factory;
       
        private final Method method;
       
        private final Class<E> type;
       
        public GenericFactory(Object factory, String methodName) {
               
                this.factory = factory;
               
                try {
               
                        this.method = FindMethod.getMethod(factory.getClass(), methodName, new Class[] { });
                       
                        this.method.setAccessible(true);
                       
                        this.type = (Class<E>) method.getReturnType();
                       
                } catch(Exception e) {
                       
                        throw new RuntimeException(e);
                }
        }
       
        @Override
        public E createInstance()  {
               
                try {
                       
                        return (E) method.invoke(factory, (Object[]) null);
                       
                } catch(Exception e) {
                       
                        throw new RuntimeException("Cannot invoke method: " + method, e);
                       
                }
        }
       
        @Override
        public Class<E> getType() {
                return type;
        }
}