动态代理类(Proxy)

使用一个动态代理类(Proxy),通过拦截一个对象的行为并添加我们需要的功能来完成。Java中的java.lang.reflect.Proxy类 和java.lang.reflect.InvocationHandler接口为我们实现动态代理类提供了一个方案,但是该方案针对的对象要实现某些接 口;如果针对的目的是类的话,cglib为我们提供了另外一个实现方案。

一、接口的实现方案:

java 代码
 
  1. public interface StudentInfoService{  
  2.  void findInfo(String studentName);  
  3. }  
  4.  
  5. public class StudentInfoServiceImpl implements StudentInfoService{  
  6.  public void findInfo(String name){  
  7.   System.out.println("你目前输入的名字是:"+name);  
  8.  }  
  9. }
  10.   
  11. import org.apache.log4j.Logger;  
  12. import java.lang.reflect.InvocationHandler;  
  13. import java.lang.reflect.Proxy;  
  14. import java.lang.reflect.Method;  
  15.   
  16. public class MyHandler implements InvocationHandler{  
  17.  private Object proxyObj;  
  18.  private static Logger log=Logger.getLogger(MyHandler.class);  
  19.    
  20.  public Object bind(Object obj){  
  21.   this.proxyObj=obj;  
  22.   return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);  
  23.  }  
  24.    
  25.  public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{  
  26.   Object result=null;  
  27.   try{  
  28.    //请在这里插入代码,在方法前调用  
  29.    log.info("调用log日志方法"+method.getName());  
  30.    result=method.invoke(proxyObj,args); //原方法  
  31.    //请在这里插入代码,方法后调用  
  32.   }catch(Exception e){  
  33.    e.printStackTrace();  
  34.   }  
  35.   return result;  
  36.  }  
  37. }  


实现一个工厂,为了方便我们使用该拦截类(AOPFactory.java):

java 代码
 
  1. public class AOPFactory{  
  2.  private static Object getClassInstance(String clzName){  
  3.   Object obj=null;  
  4.   try{  
  5.    Class cls=Class.forName(clzName);  
  6.    obj=(Object)cls.newInstance();  
  7.   }catch(ClassNotFoundException cnfe){  
  8.    System.out.println("ClassNotFoundException:"+cnfe.getMessage());  
  9.   }catch(Exception e){  
  10.    e.printStackTrace();  
  11.   }  
  12.   return obj;  
  13.  }  
  14.    
  15.  public static Object getAOPProxyedObject(String clzName){  
  16.   Object proxy=null;  
  17.   MyHandler handler=new MyHandler();  
  18.   Object obj=getClassInstance(clzName);  
  19.   if(obj!=null) {  
  20.    proxy=handler.bind(obj);  
  21.   }else{  
  22.    System.out.println("Can't get the proxyobj");  
  23.    //throw  
  24.   }  
  25.   return proxy;  
  26.  }  
  27. }  

使用该工厂类

java 代码
 
  1. public class ClientTest{  
  2.  public static void main(String[] args){  
  3.   StudentInfoService studentInfo=(StudentInfoService)AOPFactory.getAOPProxyedObject("StudentInfoServiceImpl");  
  4.   studentInfo.findInfo("阿飞");  
  5.  }  
  6. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值