001package net.gdface.utils;
002
003import java.lang.reflect.InvocationHandler;
004import java.lang.reflect.Method;
005import java.lang.reflect.Proxy;
006
007/**
008 * 实现接口<I>实例<T>的代理类 <br>
009 * 应用层可以根据需要继承此类重写{@link #invoke(Object, Method, Object[])}方法
010 * 
011 * @author guyadong
012 *
013 * @param <I> 接口类型
014 * @param <T> 接口实现类型
015 */
016public class InterfaceDecorator<I,T> implements InvocationHandler,Delegator<T>{
017        private final Class<I> interfaceClass;
018        protected final T delegate;
019
020        /**
021         * 构造方法
022         * 
023         * @param interfaceClass 接口类
024         * @param delegate 实现接口的类
025         */
026        public InterfaceDecorator(Class<I> interfaceClass, T delegate) {
027                Assert.notNull(interfaceClass, "interfaceClass");
028                Assert.notNull(delegate, "delegate");
029                Assert.isTrue(interfaceClass.isInterface() && interfaceClass.isInstance(delegate), 
030                                "interfaceClass.isInstance(delegate)", "delegate must implement interfaceClass ");
031                this.interfaceClass = interfaceClass;
032                this.delegate = delegate;
033        }
034        /**
035         * 简化版构造函数<br>
036         * 当delegate只实现了一个接口时,自动推断接口类型
037         * @param delegate
038         */
039        @SuppressWarnings("unchecked")
040        public InterfaceDecorator(T delegate) {
041                Assert.notNull(delegate, "delegate");
042                if(delegate.getClass().getInterfaces().length !=1){
043                        throw new IllegalArgumentException(
044                                String.format("can't determines interface class from %s", delegate.getClass().getName()));
045                }
046                this.interfaceClass = (Class<I>) delegate.getClass().getInterfaces()[0];
047                this.delegate = delegate;
048        }
049        @Override
050        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
051                return method.invoke(delegate, args);
052        }
053
054        /**
055         * 返回代理的接口类
056         * @return
057         */
058        public final Class<I> getInterfaceClass() {
059                return interfaceClass;
060        }
061
062        /**
063         * 根据当前对象创建新的接口实例{@link Proxy}
064         * @return
065         */
066        public final I proxyInstance(){
067                return interfaceClass.cast(Proxy.newProxyInstance(
068                                interfaceClass.getClassLoader(),
069                                new Class<?>[]{ interfaceClass},
070                                this));
071        }
072        @Override
073        public T delegate() {
074                return delegate;
075        }
076}