在自己手动来写一个动态代理前,我们先来了解一下什么静态代理:
先定义一个Person接口和两个实现类:
然后就没了,这就是静态代理,完全没难度的感觉....
优点:可以在不对我们的XiaoFang 这个类进行修改的前提下,对它进行功能的拓展
缺点:现在XiaoFang还只是想结婚而已,万一它以后想买车,买房,买船,买飞机...买各种它想要的东西的时候,咋办呢,难道每个都需要去写吗,因为代理对象,需要实现与目标对象同样的接口,这样会导致代理类非常多,这就很不爽了,维护起来就很蛋疼了,假如接口添加个方法,代理类跟被代理类都得去维护
动态代理:
原理: 在底层拿到被代理对象引用,然后获取接口,JDK从新生成一个类,同事这个类也是实现这个接口,把被代理对象的引用也拿到,然后编译这个类获取字节码
这里我们需要改变一下代理者的内部代码了
首先我们来看一下这个Person 到底是个什么对象
我们先看看这个对象里头到底是什么飞机
super.h.invoke(this, m3, (Object[])null); 是我们getLove方法中的执行代码,我们可以看到m3就是这个类中的变量,在静态代码块中给它赋值
我们再来看看这个h 是个什么飞机
是不是突然明白了点什么东西,用InvocationHandler的invoke方法,我们再来看看这个invoke方法
Proxy.newProxyInstance(XiaoFang.class.getClassLoader(),XiaoFang.class.getInterfaces(),matchmaker);
当时我们是这么做来获取到这个$Proxy0的,现在我们来看看这里面是搞什么飞机
最后就为这个$proxy0 创建了一个对象,并且返回;
所以我们在调用这个getlove时候流程是 先调用了$proxy的getlove方法
然后再有我们在newProxyInstance时传的matchmaker 上图就变成了:
matchmaker.invoke($proxy0,me3,null);
最后还是通过我们在创建代理对象时传的被代理对象来执行的getlove方法