---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
一、代理的概述
要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能。例如:异常处理、日志、计算方法的运行时间、事物管理等等。
代理类要调用目标类的功能
目标类:
doSomething(){
methodCode.....
}
代理类:
doSomething(){
目标对象.doSomething()
}
二、代理架构图
三、动态代理的工作原理
1、Client(客户端)调用代理,代理的构造方法接受一个InvocationHandler,Client调用代理的各个方法,代理的各个请求转发给刚才通过构造方法传入的handler对象,
又把各请求分发给目标的相应的方法。就是将handler封装起来,其中this引用了当前的放(发来什么请求就接受哪个方法)。
猜想分析动态生成的类的内部代码:
a、动态生成的类实现了Collection接口(可以实现若干接口),生成的类有Collection接口中的所有方法和一个如下接受InvocationHandler参数的构造方法。
b、构造方法接受一个InvocationHandler对象,接受对象了要干什么用呢?该方法内部的代码会是怎样的呢?
实现Collection接口的动态类中的各个方法的代码又是怎样的呢?InvocationHandler接口中定义的invoke方法接受的三个参数又是什么意思?图解说明如下:
分析为什么动态类的实例对象的getClass()方法返回了正确结果呢?
为何动态类的实例对象的getClass()方法返回了正确结果,而没调用invoke方法:
因为代理类从Object上继承了许多方法,其中只对三个方法(hashCode、equals和toString)进行开发,委托给handler去自行处理,对于它身上其他方法不会交给代
理类去实现,所以对于getClass()方法,还是由Object本身实现的。即proxy3.getClass(),该是什么结果还是什么结果,并不会交给invoke方法处理。
四、自定义代理类的步骤:
<span style="font-size:18px;"> 获得动态代理类的字节码文件
Class claz=Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
//通过反射获得该动态代理类的构造方法
Constructor c=claz.getConstructor(InvocationHandler.class);
//编写一个InvocationHandler类
class myInvocationHandler implements InvocationHandler{
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
return null;
}
}
//创建实例,接受一个invocationhandler对象
c.newInstance(new myInvocationHandler());</span>
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
详细请查看:www.itheima.com