11.JAVA代理模式概括
Java中的代理表示对某个对象的一种代理模式,可以有效控制用户不能直接使用此对象。代理机制可以使某个对象的业务功能实现的一种隐藏,在不改变源数据的情况下,有利于对应用程序进行扩展或升级
代理可以看作是一种AOP模式的实现
代理模式中对象之间存在的结构
-
抽象接口:代理对象和目标对象共同实现的接口
-
代理实现对象:对目标对象的业务功能进行渲染或限制
-
目标代理对象:用户实际要访问的源对象
一、静态代理
静态代理的特性
-
代理角色和真实角色的代理关系为共同实现某个接口
-
一个真实对象对应一个代理对象
-
真实对象的实现必须存在,目标代理对象则固定不变
静态代理的代理关系较为清晰,但是若由多个真实对象则需要新建更多的代理对象,因此增加Java的内存
二、动态代理
动态代理采用Java中的代理组件实现代理的功能
动态代理的特性
-
相对于静态代理,动态代理的业务代码无需作修改且固定,不会因为应用程序的扩展和升级而变得臃肿
-
在程序运行中,可以根据目标对象类型的不同,代理对象的代理类型发生改变
-
实现AOP编程更加灵活,这是静态代理无法代替的
InvocationHandler组件
InvocaticonHandler组件是java.lang.reflect反射包下的创建代理对象方法调用的规范接口
任意普通类实现InvocationHandler接口来重写代理对象方法
通过类反射原理来获取当前代理对象实现的方法
实现代理对象中的方法
/**
*invoke 实现动态代理的方法
* @param proxy 指定被代理对象的实例
* @param method 指定被代理对象的实例方法
* @param args 指定传递给目标方法的参数 没有则指定为null
* @return 指定方法的返回值
* @throws Throwable
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {}
Proxy组件
Proxy组件是java.lang.reflect包下用于创建代理对象的实例和静态方法
通过Proxy反射的对象来调用当前代理对象实现的接口方法
创建Proxy对象的方法
通过调用Proxy的静态方法进行创建
Object Proxy.newProxyInstance(ClassLoader, Class [] interfaces , Invocationhandler)
传入的参数
-
ClassLoader 指定当前目标对象的类加载器
-
interfaces 当前目标对象实现的所有接口数组
-
Invocationhandler 当前代理对象调用方法的实例
-
return 为所有动态代理类的超类