1.什么是代理模式?
- 例子
在了解Java动态代理技术之前,先了解一下什么是代理模式,其实代理模式在生活中很常见,比如房东与中介其实就是一个代理的过程,房东有自己的房子,在代理模式中扮演角色是被代理对象,中介扮演角色是代理对象,此时有租客想租房子,由于中介已经代理了房东的房子,所以租客(客户端)可以直接通过中介(代理对象)询问自己需要的房子类型(忽略租客直接找房东),中介由于代理了房东的房子(被代理对象),当然中介可以代理多个房东的房子,以应对不同的租客(客户端).这 个过程其实就是代理模式 - 结论
代理模式的角色:代理对象、被代理对象、公共抽象类(租客要找的房子类型在中介中要有)
代理对象可以代理一个或者多个对象(其实都是代理一个,多个对象的概念从接口维度出发,一个对象实现多个接口)
代理模式可以起到一个隔离的作用
代理模式可以统一为被代理对象做处理 - 代理模式的几种实现方式
1. 静态代理
静态代理实现起来相对简单,首先从从上面我们知道代理对象的几个角色,一个公共抽象接口、一个代理对象、一个被代理对象,所以只需要在代理对象里记录被代理对象的引用即可
1 | java复制代码public class StudentProxy implements Person { |
总结: 1.静态代理,实现简单,但如果存在多个类要被代理,则需要为每个被代理类建立一个代理类,并且每个方法都要重写,然后在方法中调用被代理对象对于的方法。2.代理对象是我们人为编写的。)
2. 动态代理
- JDK动态代理
实现原理以及技术,首先jdk动态代理的实现是基于Java反射技术以及字节码生成技术来实现的,它是先通过反射获取到被代理类的方法然后生成一个包含了被代理类所有方法的Proxy子类来实现代理。
jdk动态代理的代理对象是动态生成的,并非手动编写
实现代码
1 | java复制代码public interface Good { |
总结: 从代码反编译后的代理类实现可以看到,如果从接口维度出发确实可以代理多个对象,另外可以看出jdk动态代理是在运行时动态生成字节码技术以及反射技术来实现的.
源码分析
1 | java复制代码Proxy类中 |
总结:
1.jdk动态代理其实就是通过Java反射把被代理类的接口方法获取到然后生成一个新的代理类,通过类加载器把生成的代理类字节码动态调入jvm中从而实现动态代理。
2.jdk动态代理只能代理基于接口的被代理对象,非接口是不支持的)
2.cglib代理(支持非接口被代理对象)
待续….
本文转载自: 掘金