Proxy动态代理机制的Java实现

动态代理Proxy

    代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

    通过代理层这一中间层,有效的控制对于真实委托类对象的直接访问,同时可以实现自定义的控制策略(Spring的AOP机制),设计上获得更大的灵活性。

下面,举一个简单例子(在小猫吃鱼的基础上添加打印日志的功能),来模拟动态代理机制的原理


动态代理机制的步骤


1、定义被代理对象Cat.java和其实现的接口Animal


 2、声明父接口InvocationHandler

 

3、定义“日志打印”的实现类LogHandler

4、模拟动态代理类Proxy.java,jdk中的Proxy类会利用“反射”机制,动态地帮助我们生成下面地Java代码,并且直接编译成二进制的class文件,装载到类加载器中。


     

5、Test类

结果:

开始打印

Cat eats fish

结束打印

开始打印

喵喵喵...

结束打印

开始打印

在北京跑了20米

结束打印

在d:/Software/eclipse/com/oracle/dynamicProxy/目录下,生成的$Proxy1.java如下:

package com.oracle.dynamicProxy;
import java.lang.reflect.Method;
public class $Proxy1 implements com.oracle.dynamicProxy.Animal{
    public com.oracle.dynamicProxy.InvocationHandler h;
    private Object[] args=null;
    public $Proxy1(com.oracle.dynamicProxy.InvocationHandler h){
        this.h = h;
    }
@Override
 public void run(int foo,java.lang.String uja){
    try{
      Method md = com.oracle.dynamicProxy.Animal.class.getMethod("run",int.class,String.class);
      args = new Object[]{foo,uja};
      h.invoke(this, md, args);
    }catch(Exception e){
     e.printStackTrace();
    }
  }@Override
 public void eat(java.lang.String ipj){
    try{
      Method md = com.oracle.dynamicProxy.Animal.class.getMethod("eat",String.class);
      args = new Object[]{ipj};
      h.invoke(this, md, args);
    }catch(Exception e){
     e.printStackTrace();
    }
  }@Override
 public void sound(){
    try{
      Method md = com.oracle.dynamicProxy.Animal.class.getMethod("sound");
      args = null;
      h.invoke(this, md, args);
    }catch(Exception e){
     e.printStackTrace();
    }
  }
}









  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值