2021-06-01---动态代理

记录---动态代理的使用

 

当我们在日常工作或者学习时用到第三方工具,或者其他不能手动修改的源码工具包的时候,返现第三方提供的工具类并不能满足我们的正常使用,这个时候我们就需要来对这个类加强

一、继承重写父类方法加强

加强类的时候我们不妨能够想到,继承的方法用子类来对父类中的方法进行方法重写,但是使用的时候发现 继承需要创建对象的主动权在我们自己的手中。

不能对静态方法进行加强,而且还不能进行批量的增强,这样 用继承的方法来加强类,受限太多。不好!

二、使用装饰者设计模式进行加强

1、需要装饰类和被装饰类使用同一个接口(为了保证被装饰类的功能的完整性)

2、在装饰类将被装饰类传递进来

3、如果不是要增强的方法,让被装饰的对象原封不动的调用

4、增强的方法自己编写逻辑

装饰者设计模式的确能够加强类,可以批量加强,可以动态增强

但是缺点也很明显,如果被装饰类中的方法过多,则需要把所有的方法重写 (心累!!!)

需要面向接口编程。

应用场景

接口中只有少量方法需要重写的时候才适用,其他时候不推荐,因为太麻烦了!!!

适配器设计模式,不写了!完全是掩耳盗铃,还是得自己重写方法,只不过主方法看着舒服。

三、动态代理

ohhhhhhhh!!!!

动态代理和装饰者设计模式的区别:动态代理可以使用invoke方法来帮我们调用被加强类中的无用方法,我们只需要筛选出来需要加强的类就ok!!!

动态代理出现了,也是有使用的条件:

真实对象一定要有接口

1、使用Proxy类来创建newProxyInstance 对象

需要传递三个参数,1.被加强类的类加载器  2.new Class[] {接口字节码} 3.重写invoke方法

3.1 在invoke方法中过滤出我们要增强的方法。

2、创建代理对象

3、使用代理对象的方法

 

优点:灵活多变,不需要重写大量无用的方法

缺点:真实对象必须有接口的支持才行

 

package jdbc_day02.study.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @ClassName : Test1
 * @Author : 
 * @Dare : 2021/6/1 19:39
 * @Description : 动态代理
 */
public class Test1  {
    public static void main(String[] args) {
        // 创建需要加强对象(弱鸡对象)
        NanMan nanMan = new NanMan();
        // 使用动态代理增强
        //1. 使用proxy类来创建一个新的动态代理实现类, 三个参数
        //2. 参数:弱鸡对象的类加载器,数组参数 元素为接口类,第三个参数是用来调用弱鸡对象中的方法的一个方法(不需要自己再手动实现弱鸡对象中的方法)
        //3. 在方法中进行判断,调用方法的名字是否是需要增强的方法,如果不是则返回并且直接调用
        //4. 如果是 则进行增强 并且返回null
        Man markmoney = (Man) Proxy.newProxyInstance(nanMan.getClass().getClassLoader(), new Class[]{Man.class}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                if (method.getName().equals("markmoney")) {
                    method.invoke(NanMan, args);
                    System.out.println("世界这么大,我想去看看呀!!!");
                    return null;
                } else {
                    return method.invoke(NanMan, args);
                }
            }
        });
        markmoney.markmoney();
        markmoney.happy();
    }
}

这里只附上动态代理的代码部分,弱鸡类和接口类,没有附加。仅供参考!

 

2021-6-1

mua马

不忘童真,方得美好!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值