您好,欢迎访问三七文档
动态代理首先创建委托类对象,将其以构造函数传入代理处理器,代理处理器ProxyHandler中会以Java反射方式调用该委托类对应的方法。然后使用Java反射机制中的Proxy.newProxyInstance方式创建一个代理类实例,创建该实例需要指定该实例的类加载器,需要实现的接口(即目标接口),以及处理代理实例接口调用的处理器。最后,调用代理类目标接口方法时,会自动将其转发到代理处理器中的invoke方法内,invoke方法内部实现预处理,对委托类方法调用,事后处理等逻辑。使用Java动态代理机制的好处:1、减少编程的工作量:假如需要实现多种代理处理逻辑,只要写多个代理处理器就可以了,无需每种方式都写一个代理类。2、系统扩展性和维护性增强,程序修改起来也方便多了(一般只要改代理处理器类就行了)。使用Java动态代理机制的限制:目前根据GOF的代理模式,代理类和委托类需要都实现同一个接口。也就是说只有实现了某个接口的类可以使用Java动态代理机制。但是,事实上使用中并不是遇到的所有类都会给你实现一个接口。因此,对于没有实现接口的类,目前无法使用该机制。但是没有实现接口的类,该如何实现动态代理呢?当然不是没有办法,这也是我后面抽时间要继续整理和总结原先使用过的一件神器,相关Blog会不定期发上来。那就是大名鼎鼎的CGLib...反射反射是通过字节码文件对象,将类的字段,方法,构造器等映射成相应的类,并进行各自的操作;类加载器是通过某个类的.classLoader()方法,将该类的.class文件从硬盘中加载到java虚拟机中,形成字节码文件;动态代理是为了实现目标类的功能,并添加特有的系统功能,传入类加载器,目标类的接口,以及InvocationHandler接口的实现子类,(InvocationHandler接口的invoke()方法,要传入代理对象,方法名,方法的参数,在invoke方法中,可以添加特有的系统功能)然后就可以根据运行时,目标类的不同,以及要实现系统功能的不同,动态生成代理类,来完成相应的功能类的创建;
本文标题:动态代理原理
链接地址:https://www.777doc.com/doc-2614524 .html