黑马程序员-动态代理

---------------------- android培训java培训 、期待与您交流! ----------------------

 

 

动态代理模式

代理是只在不改变源文件的情况下,在源文件的功能基础上,添加其他的功能。比如
添加日志、权限检查等等,而不对原来的纵向业务逻辑产生影响。当不需要这些新添加的
功能的时候,可以直接很简单去除这些功能。


代理的实现 
静态代理的实现可以通过继承 、实现同一接口(聚合)的方式来实现。但是继承实现
起来很不方便,当需要实现的代理功能多时,会使类越来臃肿。所以一般都使用实现接口的方式来
实现代理。这个时候新的问题又出现了,当我们需要对很多类进行代理的时候,程序又变得笨拙,
因此,我们需要对不同的类动态的产生代理对象。这就是动态代理。

动态代理可以对任意对象,任意接口的方法,实现任意的代理

动态代理的原理是根据传入的对象动态生成代码。

实现动态代理的步骤
1 被代理类需要实现一个接口
2 创建代理类实现InvocationHandler 并重写invoke方法。
3 调用方法自身的invoke, 这时可以在invoke方法前后加入需要的逻辑
4 在主函数中创建接口对象和InvocationHandler对象
5 调用Proxy.newProxyInstance()传入接口对象的类加载器、接口对象和InvocationHandler对象
6 调用需要被代理的烦方法

实例

//创建被代理类的接口对象
public interface Car {
 void run();
 void stop();
}
//被代理类实现接口
public class Tank implements Car {
 public void run() {

  System.out.println("run.........");
 }

 @Override
 public void stop() {
  System.out.println("stop..........");
 }
}
//创建代理类并实现InvocationHandler接口,重写invoke方法
public class LogHandler implements InvocationHandler{
 private Car tank;
 @Override
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  System.out.println("before log");//加入需要的逻辑
  Object tank=method.invoke(this.tank,args);//调用自身的invoke方法
  
  addLog();//加入需要的逻辑
  return tank;//返回invoke方法返回的值
 }
 
 public LogHandler(Tank tank) {
  super();
  this.tank = tank;
 }

 public void addLog(){
  
  System.out.println("add log");
 }

 public LogHandler(Car tank) {
  super();
  this.tank = tank;
 }
 
 
}
//主函数
public class Test {
 public static void main(String[] args) {
  //创建接口对象
  Car c = new Tank();
  //创建被代理类对象   
  InvocationHandler h = new LogHandler(c);
  //调用 Proxy.newProxyInstance方法传入参数分别是: 被代理类的类加载器,被代理类实现的接口 ,代理类
  Car car =(Car) Proxy.newProxyInstance(c.getClass().getClassLoader(), c.getClass()
    .getInterfaces(), h);
  car.run();//调用被代理类中的方法
  
  
 }
}


 

 

 

---------------------- android培训java培训 、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值