java动态代理

java动态代理

什么是动态代理

动态代理就是可以任意的控制任意对象的执行过程,意思就是说这个对象的执行过程可以由客户端灵活的指定,可能这样说还是不太明确,通俗说就是

本来应该自己做的事情,因为没有某种原因不能直接做,只能请别人代理做。被请的人就是代理。比如我们需要个妹子,而我们自己找太麻烦了,就可以找个人帮你找妹子。通俗的将就是在调用实现类的方法时,可以在方法执行前后做额外的工作,这个就是代理。

在java中如何实现动态代理

先来个找妹的接口

public interface DynamicDao {

     /**
     * 找妹子

     */
    void forSister();
}
复制代码

再写一个找妹实现类来实现这个接口,这个实现类就是我们要代理的对象

public class DynamicDaoImpl implements DynamicDao {


    @Override
    public void forSister() {
        System.out.println("找妹子");


        System.out.println("发现萌妹");
        
        System.out.println("跟妹子要联系方法");

    }
}
复制代码

再新建个Handler(帮找妹子的人) 这个类必须继承InvocationHandler接口

处理类(即能够做额外工作的类):

public class MediationHandle implements InvocationHandler {
    /**
     * 持有被代理对象的引用(此引用可以有外部灵活制定的)
     */
    private Object target;

    public MediationHandle(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("去妹子出现率高的场合");
        method.invoke(target, args);
        System.out.println("把联系方式给雇主");
        return null;
    }
}
复制代码

找妹子的人有了 如何让他去帮咱们找妹子呢? 实现如下

public class DynamicProxyTest {

    @Test
    public void testProxy() {
         // 需要代理的对象
        DynamicDao dynamicDao=new DynamicDaoImpl();
        //创建一个帮找妹子的人 指定找妹子的实现
        MediationHandle handle = new MediationHandle(dynamicDao);
        // 创建代理 handle+proxy才能实现动态代理(反射的方式)
        DynamicDao dynamicDaoProxy= (DynamicDao) Proxy.newProxyInstance(
                dynamicDao.getClass().getClassLoader(),
                dynamicDao.getClass().getInterfaces(),
                handle
        );
        //开始找妹子
        dynamicDaoProxy.forSister();

    }
}

复制代码

打印的值

去妹子出现率高的场合
找妹子
发现萌妹
跟妹子要联系方法
把联系方式给雇主
复制代码

好了,这就实现了动态代理,spring中的Aop默认也是基于这种方式 需要配置拦截的方法

spring Aop 还提供了另一种方式来实现动态代理 Cglib 下篇再讲

转载于:https://juejin.im/post/5d04ea84f265da1bb67a16a6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值