1. 程式人生 > >java動態代理--代理介面無實現類

java動態代理--代理介面無實現類

轉載自 http://blog.csdn.net/zhu_tianwei/article/details/40076391

使用通過介面定義,或解析介面註解等完成相關功能,如mybatis的SqlSession.getMapper的實現

1.介面定義

  1. package cn.proxy;  
  2. publicinterface IHello {  
  3.     String say(String aa);  
  4. }  

2.代理實現
  1. package cn.proxy;  
  2. import java.lang.reflect.InvocationHandler;  
  3. import java.lang.reflect.Method;  
  4. import java.lang.reflect.Proxy;  
  5. /** 
  6.  *  JDK動態代理代理類  
  7.  * 
  8.  */
  9. @SuppressWarnings("unchecked")  
  10. publicclass FacadeProxy implements InvocationHandler {    
  11.     @Override
  12.     public Object invoke(Object proxy, Method method, Object[] args)    
  13.             throws Throwable {    
  14.         System.out.println("介面方法呼叫開始"
    );    
  15.         //執行方法  
  16.         System.out.println("method toGenericString:"+method.toGenericString());  
  17.         System.out.println("method name:"+method.getName());  
  18.         System.out.println("method args:"+(String)args[0]);  
  19.         System.out.println("介面方法呼叫結束");    
  20.         return"呼叫返回值";    
  21.     }    
  22.     publicstatic <T> T newMapperProxy(Class<T> mapperInterface) {  
  23.         ClassLoader classLoader = mapperInterface.getClassLoader();  
  24.         Class<?>[] interfaces = new Class[]{mapperInterface};  
  25.         FacadeProxy proxy = new FacadeProxy();  
  26.         return (T) Proxy.newProxyInstance(classLoader, interfaces, proxy);  
  27.       }  
  28. }  
4.執行
  1. package cn.proxy;  
  2. publicclass Test {  
  3.     publicstaticvoid main(String[] args) {  
  4.         IHello hello = FacadeProxy.newMapperProxy(IHello.class);  
  5.         System.out.println(hello.say("hello world"));  
  6.     }  
  7. }  

執行結果:
  1. 介面方法呼叫開始  
  2. method toGenericString:public abstract java.lang.String cn.proxy.IHello.say(java.lang.String)  
  3. method name:say  
  4. method args:hello world  
  5. 介面方法呼叫結束  
  6. 呼叫返回值