[JAVA] 重学 JAVA 系列 - 动态代理类

阅读更多
1 名词解释
动态代理类 一个不需要编写的类, 由代码自动生成并加载.
代理接口   需要代理的普通接口
代理实例   代理类的实例
Invocation Handler 代理类的调用处理器
CGLIB 可以创建/修改字节码文件的工具包.

2
重要概念
动态代理类是指运行时创建并加载实现代理接口的类,代理类的实例叫代理实例, 代理实例的方法调用都会分发到实例所持有的Invocation Handler的invoke方法. 因为动态代理类的创建依赖接口,因此通过反射调用是类型安全的,不会调用到非代理接口外的方法.

3 原理
通过动态生成字节码并加载到内存,来实现类的动态加载.理论上可以支持创建任何形式的类.但为了防止代码乱用.业界流行两种方法:
第一种: 使用JAVA的动态代理机制, 这种方法采用实现接口并关联原始类的实例来实现重写原始类的方法.
第二种: 使用第三方包CGLIB等的动态代理机制, 这种方法采用继承的原始类方法来重写重写原始对象的方法.这种方法原理与第一种相同,本文略过.

4 规则
a. 多个接口类必须不同。
b. 多个接口类的方法返回值必须相同。
c. 多个接口类的方法重复时,只使用接口顺序靠前的接口的方法,后面接口的方法忽略。
d. 多个接口类的Object方法,不能重写(代理)。
e. 代理类可实现序列化、反序列化接口。
f. 接口数量最大不能超过65563。
g. 多个接口类为非public接口时,必须属于同一个包。
h. 多个接口类对于ClassLoader都是可见的。
i. 使用同一个ClassLoader与接口列表创建的代理类会缓存,供重复获取时使用。
j. 代理类不要引用ClassLoader,接口类与代理类, 避免垃圾不能回收。
k. 代理类使用InvocationHandler来重写代理方法。

5 场景
a. Spring AOP中的拦截器
b. Hibernate 的延迟加载
c. 日志,权限等代码注入。只需要知道对象。

你可能感兴趣的:(java)