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}