动态代理实现

学习动态代理之前,先来看一种常见的设计模式--代理模式。

代理模式是一中经常使用的设计模式。主要特点是代理类与委托类具有相同的接口。所谓委托类是接口的真正实现者,代理类只是调用委托类相关的方法实现特定的功能,代理类可以为委托类预处理信息。假设Personal为一个委托类。eat()方法是委托类的一个方法。在实现吃饭方法之前要盛饭。所以就出现一个代理类PersonalProxy,目的是预先处理一些操作。

以上是代理模式的主要思路。

所谓动态代理,就是利用反射的思想实现代理类。动态代理的实现主要利用了类Proxy与Invocationhandler接口来实现。

还是拿以上的人的例子来看。

首先,人(Personal)实现动物接口(Animal)

Animal接口:

public interface Animal {
    void sleep();

    void eat();
}

Persoal类

public class Personal implements Animal {
    @Override
    public void sleep() {
        System.out.println("人在睡觉");
    }

    @Override
    public void eat() {
        System.out.println("人在吃饭");
    }

    public void play() {
        System.out.println("人在玩耍");
    }
}

人的动态代理类PersonalProxy

public class PersonalProxy implements InvocationHandler {
    Object object;

    public PersonalProxy(Object object) {
        this.object = object;
    }

    public PersonalProxy() {

    }

    /**
     * @param proxy
     * @param method
     * @param args
     * @see java.lang.reflect.InvocationHandler#invoke(Object, Method, Object)
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("预先处理的事情");
        Object invoke = method.invoke(object, args);
        return invoke;
    }
}

最后的实现demo

 @Test
        public void testProxy() {
            InvocationHandler personalProxy =  new PersonalProxy(new Personal());
            Animal animal =(Animal) Proxy.newProxyInstance(Animal.class.getClassLoader(), new Class[]{Animal.class}, personalProxy);
            animal.sleep();
        }

在最后的demo中可以看出主要的方法

创建实现InvocationHandler接口对象。

然后创建动态代理类使用Proxy.newProxyInstance方法。创建出来的对象就是动态代理对象。

可以看出,实现InvocationHandler的对象必须实现invoke方法,这个方法就是所谓的代理类的预处理操作,调用实际业务类的操作。至于具体的原理,等待以后的详细描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值