首页 > 学院 > 开发设计 > 正文

动态代理

2019-11-06 08:26:24
字体:
来源:转载
供稿:网友

什么是代理:

首先对代理做下简单的说明,代理可以具体映射到我们的现实生活中,比如火车票的购买过程,买票的动作可以在火车站的售票窗口执行也可以在火车的代售点购买到,但是在火车代售点只能购票却不能退票,而且在代售的过程中我们需要收取购票费用。代理其实可以理解为代售点,可以理解为代理和目标对象之间代理可能没有目标对象的功能,但是也可以增加目标对象没有的功能。简单的说代理就是对象将一个自己不能去直接或者不想去做的事情交给别的对象做。

代理的实现: jdk动态代理和cglib动态代理

jdk动态代理:jdk动态代理的实现条件:目标对象必须是实现了接口。实现的过程:首先自己定义一个事物管理器MyInvocationHandler,这个类实现InvocationHandler接口,在事物管理器中重写一个方法invoke,此方法包含了三个参数Object PRoxy, Method method, Object[] args,简单说下参数的意思proxy指被代理的对象,method被代理对象的方法,args被代理方法的参数。那么我们产生的这个代理对象如何获取呢?使用newProxyInstance这个对象可以获取到目标对象的代理。具体的实现如下:目标对象实现的接口:
public interface IUserService {    public    abstract   void study();}目标对象实现类:
public class UserServviceImpl implements IUserService {    public void study() {        System.out.println("This is study()...");    }}自定义事物管理器:
public class MyInvocationHandler implements InvocationHandler {    //目标对象    private Object objects;    /**     * 构造方法     * @param object     */    public MyInvocationHandler(Object object) {        super();        this.objects = object;    }    /**     *执行目标对象的方法     * @param proxy     * @param method     * @param args     * @return     * @throws Throwable     */    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        // 在目标对象的方法执行之前简单的打印一下        System.out.println("------------------开始------------------");        Object object=method.invoke(objects,args);        // 在目标对象的方法执行之后简单的打印一下        System.out.println("------------------结束------------------");        return object;    }    }测试类:
public class MyInvocationtTest {    /**     * jDK动态代理测试   */    @Test    public  void  testInvocation(){        // 实例化目标对象        IUserService  userService=new UserServviceImpl();        // 实例化InvocationHandler        MyInvocationHandler myInvocationHandler=new MyInvocationHandler(userService);        // 根据目标对象生成代理对象        IUserService userServices=(IUserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(),userService.getClass().getInterfaces(),myInvocationHandler);        // 调用代理对象的方法        userServices.study();    }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表