记录---动态代理的使用
当我们在日常工作或者学习时用到第三方工具,或者其他不能手动修改的源码工具包的时候,返现第三方提供的工具类并不能满足我们的正常使用,这个时候我们就需要来对这个类加强。
一、继承重写父类方法加强
加强类的时候我们不妨能够想到,继承的方法用子类来对父类中的方法进行方法重写,但是使用的时候发现 继承需要创建对象的主动权在我们自己的手中。
不能对静态方法进行加强,而且还不能进行批量的增强,这样 用继承的方法来加强类,受限太多。不好!
二、使用装饰者设计模式进行加强
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马
不忘童真,方得美好!