黑马程序员_高新技术之代理浅谈

本文介绍了代理模式的概念及其应用场景,详细解析了动态代理的工作原理,包括客户端如何通过代理调用目标对象的方法,以及动态生成的类如何实现接口并利用InvocationHandler进行方法调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------------- 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值