java动态代理--代理接口无实现类

来源:互联网 发布:溪谷h5游戏平台源码 编辑:程序博客网 时间:2024/05/16 02:06

使用通过接口定义,或解析接口注解等完成相关功能,如mybatis的SqlSession.getMapper的实现

1.接口定义

[java] view plain copy
 print?
  1. package cn.proxy;  
  2.   
  3. public interface IHello {  
  4.     String say(String aa);  
  5. }  

2.代理实现

[java] view plain copy
 print?
  1. package cn.proxy;  
  2.   
  3. import java.lang.reflect.InvocationHandler;  
  4. import java.lang.reflect.Method;  
  5. import java.lang.reflect.Proxy;  
  6.   
  7. /** 
  8.  *  JDK动态代理代理类  
  9.  * 
  10.  */  
  11. @SuppressWarnings("unchecked")  
  12. public class FacadeProxy implements InvocationHandler {    
  13.     @Override    
  14.     public Object invoke(Object proxy, Method method, Object[] args)    
  15.             throws Throwable {    
  16.         System.out.println("接口方法调用开始");    
  17.         //执行方法    
  18.         System.out.println("method toGenericString:"+method.toGenericString());  
  19.         System.out.println("method name:"+method.getName());  
  20.         System.out.println("method args:"+(String)args[0]);  
  21.         System.out.println("接口方法调用结束");    
  22.         return "调用返回值";    
  23.     }    
  24.       
  25.     public static <T> T newMapperProxy(Class<T> mapperInterface) {  
  26.         ClassLoader classLoader = mapperInterface.getClassLoader();  
  27.         Class<?>[] interfaces = new Class[]{mapperInterface};  
  28.         FacadeProxy proxy = new FacadeProxy();  
  29.         return (T) Proxy.newProxyInstance(classLoader, interfaces, proxy);  
  30.       }  
  31. }  


4.运行

[java] view plain copy
 print?
  1. package cn.proxy;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         IHello hello = FacadeProxy.newMapperProxy(IHello.class);  
  6.         System.out.println(hello.say("hello world"));  
  7.     }  
  8. }  

运行结果:

[plain] view plain copy
 print?
  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. 调用返回值  
0 0