反射技术中有两个很重要的部分,一个是注解,一个是动态代理,刚刚学完代理模式,做一个笔记记录一下~
什么是代理模式呢,生活中最常见的代理模式应该就是房租中介了吧,
房地产商提供房源,中介与顾客接触,而房地产商不是与顾客直接接触,这样就形成了一种代理模式(原谅一下灵魂画手哈)
有几点需要注意一下:
1.顾客只关心房地产商的房子,而不关心是谁在卖
2.代理是房租中介,顾客通过中介接触房子
在静态代理中,我们可以把房地产商看作一个接口,然后呢,底下有它的实现类,房子(真正实现接口的实现类),代理人,中介(虽然实现了接口,但是却是调用了房子),两个一同实现了房地产商接口。
(房地产商接口)
/**
* Created on 00:21 13/08/2019
* Description:
*
* @author Weleness
*/
public interface SellHouse {
void sell();
}
(房子实现类)
**
* Created on 00:22 13/08/2019
* Description:
*
* @author Weleness
*/
public class RealHouse implements SellHouse {
@Override
public void sell() {
System.out.println("我是三环外的房子");
}
}
(房租中介,拿到房子,向顾客推销)
/**
* Created on 00:22 13/08/2019
* Description:
*
* @author Weleness
*/
public class SellProxy implements SellHouse {
RealHouse realHouse;
public SellProxy(RealHouse realHouse) {
this.realHouse = realHouse;
}
@Override
public void sell() {
realHouse.sell();
zhongjie();
zhongjie2(false);
zhongjie2(true);
}
public static void zhongjie() {
System.out.println("我们卖的房子啊,风景好,冬暖夏凉");
}
public static void zhongjie2(boolean isBuy) {
if (isBuy)
System.out.println("感谢您的惠顾,这是您的房产证");
else
System.out.println("您再考虑一下嘛,三环哦,交通方便,气候适宜");
}
}
(测试代码以及测试结果)
/**
* Created on 00:27 13/08/2019
* Description:
*
* @author Weleness
*/
public class Test2 {
public static void main(String[] args) {
RealHouse realHouse = new RealHouse();
SellProxy sellProxy = new SellProxy(realHouse);
sellProxy.sell();
}
}
代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。值得注意的是,代理类和被代理类应该共同实现一个接口,或者是共同继承某个类。
什么叫做静态呢?因为它的类型是事先预定好的,比如上面代码中的 SellProxy这个类。
好了,介绍完静态代理,我们来介绍一下动态代理
首先,动态代理在目的上和静态代理是没有区别的,唯一有区别的就是静态和动态之分。
什么是动态呢,我们通过代码来看下
还是卖房子这个问题
不过这次中介人不是我们指定的了,是由中介公司给你分配的
/**
* Created on 00:31 13/08/2019
* Description:
*
* @author Weleness
*/
public class ZhongjieRen implements InvocationHandler {
Object fangzi;
public ZhongjieRen(SellHouse fangzi) {
this.fangzi = fangzi;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("你好我是中介,为你介绍这款房子");
method.invoke(fangzi,args);
System.out.println("销售结束");
return null;
}
}
这个InvocationHandler接口是什么呢,我待会解释
然后我们就可以开始买房子了
/**
* Created on 00:35 13/08/2019
* Description:
*
* @author Weleness
*/
public class SellFactory {
public static void main(String[] args) {
BeiSanhuan beiSanhuan = new BeiSanhuan();
InvocationHandler fangzi = new ZhongjieRen(beiSanhuan);
SellHouse sellHouse = (SellHouse) Proxy.newProxyInstance(BeiSanhuan.class.getClassLoader(),BeiSanhuan.class.getInterfaces(),fangzi);
sellHouse.Sell();;
}
}
在这里,我并没有去创建了一个继承SellHouse接口的代理类,也可以调用到sell方法,这就是所谓的**“动态”**
动态代理中,主要涉及到两个东西,InvocationHandler接口,和Proxy类,
InvocationHandler接口主要是让其实现类实现它里面的规范,相当于标记的作用,当Proxy类调用newProxyInstance方法,
传递被代理对象的类加载器,被代理对象实现的接口,以及被InvocationHandler接口标记的实现类,当被代理对象的方法被调用。Proxy会通过传进去的接口通过反射动态生成一个实现类,这个实现类又通过InvocationHandler中的invoke方法,调用被代理对象的方法,从而达到代理的目的。
以上是我个人的理解,有错误的地方请多纠正,谢谢。