黑马程序员-----代理

来源:互联网 发布:tor网络原理文章 编辑:程序博客网 时间:2024/05/21 07:12
------- android培训java培训、期待与您交流! ----------

invoke(“代理”)

代理的本质是编写与目标类相同接口的代理类,代理类的每个方法调用目标类相同的方法,并且在调用方法时加上需要的系统功能的代码
代理中的概念解释:

AOP-->Aspect oriented program 面向切面编程

功能贯穿模块---->交叉业务

AOP的目标就是使交叉业务模块化

使用代理技术方案解决AOP

JVM可以在运行期动态生成类的字节码,往往用作代理称作动态代理类

JVM生成的动态类必须实现一个或多个目标类继承的接口,所以JVM生成的动态类只能用作相同接口的目标类的代理

如果目标类没有接口,适用CGLIB(第三方库)可以动态生成一个类的子类


代理类需要在调用目标方法加上系统功能

可以在目标方法前,后,前后,catch块中

通过Proxy生成动态类 

Proxy.getProxyClass(ClassLoader,Interface.class)

ClassLoader---->指定类加载器

Interface.class----->接口的字节码


创建动态类的实例对象

Proxy.newProxyInstance(ClassLoader,Interface.calss…[],Constructor's Parameter)

省去了反射建立实例的步骤

Interface.calss…[]

--->实现的接口”们”

Constructor's Parameter

--->构造函参数


Proxy建立的动态类的构造方法需要一个InvocationHandler类的实例参数

new InvocarionHandler(){    public void invoke(Object proxy,Method method,Object [] args){        //dosomething before        method.invoke(target,args);        //dosomething after    }}

proxy--->代理类对象  method--->代理方法,args---->方法需要的参数

InvocationHandler原理分析

通过代理类的构造方法传入InvocationHandler子类对象,对象通过调用目标类方法并在前后dosth.before&&dosth.after加上系统功能代码实现代理

InvocationHandler的invoke需要3参数,代理对象(目标对象),方法,方法执行参数


!对于从Object类下继承的方法,只有hashcode,equals,toString会交给invocationHandler处理,其他的不会


将系统功能封装到对象之中,实现切面编程,可以写出通用代理方法

public Object getProxy(Object target,Advice advice){    Proxy.newProxyInstance(.....        ......        new InvocarionHandler(){        ...        advice.before();//将系统功能封装到Advice类中        method.invoke(target,args);        advice.after();//将系统功能封装到Advice类中        ...    }}





-------  android培训、java培训、期待与您交流! ----------

  详细请查看:http://edu.csdn.net/heima/
原创粉丝点击