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}