当前位置:首页 > CN2资讯 > 正文内容

Java代理模式之动态代理模式

2天前CN2资讯

Java动态代理模式

动态代理是指代理类对象在程序运行时由JVM根据反射机制动态生成的。动态代理不需要定义代理类的.java源文件。

动态代理其实就是jdk运行期间,动态创建class字节码并加载到JVM。

动态代理的实现方式常用的有两种:使用JDK代理代理,与通过CGLIB动态代理。

jdk的动态代理

jdk动态代理是基于Java的反射机制实现的。使用jdk中接口和类实现代理对象的动态创建。

Jdk的动态要求目标对象必须实现接口,这是java设计上的要求。

从jdk1.3以来,java语言通过java.lang.reflect包提供三个类支持代理模式Proxy, Method和InovcationHandler。

⒈ InvocationHandler接口

InvocationHandler接口叫做调用处理器,负责完调用目标方法,并增强功能。

通过代理对象执行目标接口中的方法,会把方法的调用分派给调用处理器(InvocationHandler)的实现类,执行实现类中的invoke()方法,我们需要把功能代理写在invoke()方法中 。

接口中只有一个方法:

在invoke方法中可以截取对目标方法的调用。在这里进行功能增强。Java的动态代理是建立在反射机制之上的。

实现了InvocationHandler接口的类用于加强目标类的主业务逻辑。这个接口中有一个方法invoke(),具体加强的代码逻辑就是定义在该方法中的。通过代理对象执行接口中的方法时,会自动调用invoke()方法。

invoke()方法的介绍如下:

public Object invoke ( Object proxy, Method method, Object[] args)
proxy:代表生成的代理对象
method:代表目标方法
args:代表目标方法的参数

第一个参数proxy是jdk在运行时赋值的,在方法中直接使用,第二个参数后面介绍,第三个参数是方法执行的参数, 这三个参数都是jdk运行时赋值的,无需程序员给出。

⒉Method 类

invoke()方法的第二个参数为Method类对象,该类有一个方法也叫invoke(),可以调用目标方法。这两个invoke()方法,虽然同名,但无关。

public Object invoke ( Object obj, Object... args)
obj:表示目标对象
args:表示目标方法参数,就是其上一层invoke方法的第三个参数

该方法的作用是:调用执行obj对象所属类的方法,这个方法由其调用者Method对象确定。

在代码中,一般的写法为method.invoke(target, args);其中,method为上一层invoke方法的第二个参数。这样,即可调用了目标类的目标方法。

⒊Proxy类

通过JDK的java.lang.reflect.Proxy类实现动态代理,会使用其静态方法newProxyInstance(),依据目标对象、业务接口及调用处理器三者,自动生成一个动态代理对象。

public static newProxyInstance ( ClassLoader loader, Class<?>[] interfaces,
InvocationHandler handler)
loader:目标类的类加载器,通过目标对象的反射可获取
interfaces:目标类实现的接口数组,通过目标对象的反射可获取
handler:调用处理器。

jdk动态代理实现

jdk动态代理是代理模式的一种实现方式,其只能代理接口。

实现步骤:

① 新建一个接口,作为目标接口

② 为接口创建一个实现类,是目标类

③ 创建类实现java.lang.reflect.InvocationHandler接口,调用目标方法并增加其他功能代码

④ 创建动态代理对象,使用Proxy.newProxyInstance()方法,并把返回值强制转为接口类型。

idea创建java project

工程名称:ch02-dynamicproxy

⒈定义目标接口

⒉定义目标接口实现类

⒊定义调用处理程序

调用处理程序是实现了InvocationHandler的类,在invoke方法中增加业务功能。还需要创建有参构造,参数是目标对象。为的是完成对目标对象的方法调用。

⒋创建动态代理对象

执行流程:

类图:

cgLib代理

CGLIB(Code Generation Library)是一个开源项目。是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。它广泛的被许多AOP的框架使用,例如Spring AOP。

使用JDK的Proxy实现代理,要求目标类与代理类实现相同的接口。若目标类不存在接口,则无法使用该方式实现。

但对于无接口的类,要为其创建动态代理,就要使用CGLIB来实现。CGLIB代理的生成原理是生成目标类的子类,而子类是增强过的,这个子类对象就是代理对象。所以,使用CGLIB生成动态代理,要求目标类必须能够被继承,即不能是final的类。

cglib经常被应用在框架中,例如Spring ,Hibernate等。Cglib的代理效率高于Jdk。对于cglib一般的开发中并不使用。做了一个了解就可以。


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24189.html

    分享给朋友:

    “Java代理模式之动态代理模式” 的相关文章

    亚马逊CDN CloudFront:提升网站安全性与加载速度的理想选择

    亚马逊CDN概述 亚马逊CloudFront是亚马逊云科技旗下的一项内容分发网络(CDN)服务,它通过全球范围内的多个数据中心高效分发内容。我对这项服务的了解使我意识到,CloudFront不仅仅是一个简单的资源分发工具,它的设计旨在确保内容的流畅、高效、安全传输,尤其在当今对速度与安全性高度重视的...

    有效的被墙检测方法与工具指南

    被墙检测是指对于网站或网页进行一系列测试,以判断其是否被网络审查所封锁。这一过程不仅是技术上的探索,也是用户获取信息自由的重要环节。在如今的信息时代,能够顺利访问需要的信息,对个人和企业来说都是至关重要的。被墙检测帮助我们确认某些敏感网站或关键词的可达性,揭示了网络审查背后的复杂机制。 被墙检测的重...

    如何优雅退出ping -t命令:实用技巧与方法指南

    在当今的网络世界里,许多人时常需要检查网络连通性。这个时候,'ping'命令就显得非常实用。简单来说,'ping'命令的主要作用是检测与特定目标主机之间的连接状态。通过发送ICMP回显请求,它可以告诉我们目标设备是否可达,延迟情况如何等信息。 在众多的‘ping’命令中,‘ping -t’是特别常用...

    如何利用阿里云24元优惠活动体验云计算服务

    阿里云是一家全球知名的云计算服务提供商,致力于为用户提供多样化的云计算产品与服务。最近推出的24元优惠活动,更是为不少用户带来了新的机遇。这项优惠活动的主要目标是让更多的个人和企业体验到优质的云服务,尤其是在数字化转型日益重要的今天。用户可以通过这一活动以超低价格体验阿里云的强大功能。 在参与这个优...

    ColoCrossing:优质VPS与安全托管服务提供商解析

    在美国,ColoCrossing作为一家老牌且独立的服务器和托管服务提供商,一直以来以其优质的IT解决方案著称。这家成立多年的公司,致力于满足不同类型客户的需求,无论是面向亚太地区还是欧美市场,它都有相应的数据中心来支持各种使用场景。我个人觉得他们的服务理念是非常值得推崇的,特别是在稳定性和可靠性方...

    最新hudsonvalleyhost优惠码使用技巧与推荐2023

    hudsonvalleyhost 优惠码介绍 hudsonvalleyhost优惠码是一种可以帮助用户在使用hudsonvalleyhost服务时节省费用的代码。这种优惠码一般由字母和数字组成,用户在进行购买或订阅相关服务时输入该代码,就可以享受到折扣或特定的优惠。每个优惠码的有效期和适用范围可能不...