渣男小明想跟隔壁班的小红谈恋爱,但是小明不认识小红,小明的朋友小方认识小红,小明就委托小方送礼物给小红。第二天小明又见到了隔壁班的小兰,惊若天人,一眼万年,但是小明还是不认识小兰,小方恰好又认识,小明就继续委托小方送礼物给小红。这时候的小方就是代理。
先定义个渣男小明接口
public interface xiaoming{
public void 送礼物();
}
再定义个小红类
public class xiaohong implements xiaoming{//谁想继承你啊死渣男!
@Override
public void 送礼物(){
System.out.println("送你个礼物");
}
}
再定义个小兰类
public class xiaohong implements xiaolan{//谁想继承你啊死渣男!
@Override
public void 送礼物(){
System.out.println("送你个礼物");
}
}
如果正常送那就是
public static class main(String[] args){
xiaoming love=new xiaohong();
xiaohong.送礼物();
}
那小红就不认识小明,她跟他费什么话,不收礼物!我不我不!
这时候小方出场了
再定义一个小方类
public class xiaofang implement InvocationHandler{
private Object target;
public Object bind(Object tar) {
this.tar = tar;
return Proxy.newProxyInstance(tar.getClass().getClassLoader(),
tar.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy , Method method , Object[] args) throws Throwable {
Object result = null;
//在调用具体函数方法前,执行功能处理
result = method.invoke(tar,args);
//在调用具体函数方法后,执行功能处理
return result;
}
}
这时候送礼物就是
public static class main(String[] args){
xiaofang proxy=new xiaofang();
xiaoming love=(xiaoming) proxy.bind(new xiaohong());
love.送礼物();
xiaoming love=(xiaoming) proxy.bind(new xiaolan());//我想送谁就送谁,我是渣男我骄傲!(瞧瞧这是人话嘛???)
}
而身为一个渣男,怎么可能只在一棵树上吊死,那两边都要哄,还可以用不同的方式去哄,小方这时候就可以起作用了,他可以在送小红花之前给花剪个造型,或者给花装个礼盒;送小兰呢就。可以除了送花还可以送洋娃娃。这就是动态代理。
那如果是对送礼物方法进行重写的话,如果渣男小明又看上了个,那岂不是送礼物要改来改去??小明这渣男哪有那么多时间来搞这种事情,这不是还有小方好兄弟,好兄弟看你啦,继续修改小方动态代理类。
public class xiaofang implement InvocationHandler{
private Object target;
public Object bind(Object tar) {
this.tar = tar;
return Proxy.newProxyInstance(tar.getClass().getClassLoader(),
tar.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy , Method method , Object[] args) throws Throwable {
Object result = null;
//在调用具体函数方法前,执行功能处理
System.out.println(“买个礼盒装花花”);
System.out.println(“礼盒里面在放个香水”);
System.out.println(“再放个口红,回去一定要这个渣男大出血,我日我还是单身狗!”);
result = method.invoke(tar,args);
//送完礼物了看小姐姐反应,有好感再告诉他。
//tmd我看小姐姐也好看,好兄弟我替你先试一试,免得你受爱情的苦!!!
//从此小方和小姐姐过上了幸福快乐的日子。
//在调用具体函数方法后,执行功能处理
return result;
}
}
就这样小明被小方挖了墙角,堪称渣男界的滑铁卢
这就是动态代理的作用,活该这个渣男小明谈不到恋爱,想泡人家还要靠僚机?不主动怎么撩的到???
代理还是很有用的,在需要扩展某些相同功能的时候,如果对实现接口的类进行重写,那会花费很多时间的,而改用动态代理在代理的时候添加功能,就能很方便了,这也能进行代码的解耦,减轻了程序猿的压力,少掉点头发。
动态代理在Spring中有很大的作用,AOP就是基于动态代理来完成面向切面编程的。还有IOC中的依赖注入也依据了代理的原理。
小白写了个段子加深自己对于动态代理的理解,如果大家看得开心点个赞。如有指正请评论区告诉我。然后转载可以请注明出处,谢谢!