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

jdk动态代理和cglib动态代理介绍

9小时前CN2资讯


jdk动态代理和cglib动态代理介绍

传统的日志记录方式,需要在每个需要做日志记录的方法中,逐一添加记录日志的方法,这种方式过于繁琐。
一个项目中的方法有很多,不适用于批量方法的日志记录操作;

衍生jdk动态代理和cglib动态代理2种方式对日志操作进行统一管理
(1)jdk动态代理方式
①:Proxy类是Jdk中自带的一个工具类(反射包下,属于反射的功能),它可以帮我们创建代理类或实例
②:方法newProxyInstance()—用于创建代理对象实例
③:Proxy.newProxyInstance()方法中参数介绍:
参数一:目标对象的类加载器
参数二:目标对象实现的所有接口
参数三:InvocationHandler接口(重写invoke方法后)的实例
注意:InvocationHandler 接口的实现类中—>对代理的目标对象内的方法进行增强操作给目标对象方法前面,后面、返回处、异常处添加额外的功能代码–增强
invoke()方法内的参数介绍:
Object proxy:代理对象实例
Method method:代理对象调用的方法的反射–Method对象实例
Object[] args:调用代理方法时传递进来的参数

注意:
jdk动态代理技术使用前提条件: 目标对象必须要有接口.
优点:这种方式已经解决我们前面所有日记需要的问题。非常的灵活。而且可以方便的在后期进行维护和升级。
缺点:当然使用jdk动态代理,必需要有接口。如果没有接口,就无法使用jdk动态代理技术。
示例:明星(目标对象),经纪人(代理对象),方法(强化品牌代言功能) ,由明星操作改为经纪人操作

代码演示:

public static Object createproxy(Object target){
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/*System.out.println(method);
System.out.println(Arrays.asList(args));*/

Object result = null;
LogUtils.logBefore(method.getName(),args);
try{
//1、执行代理对象的操作
result = method.invoke(target,args);
//2、增强操作---就是日志记录操作
LogUtils.logAfterReturning(method.getName(),result);
}catch (Exception e){
//3、异常处理操作
LogUtils.logAfterThrowing(method.getName(),e);
}
return result;
}
});
}

(2)cglib动态代理方式
①:cglib跟jdk动态代理的不同是:如果目标对象没有实现接口,
cglib同样可以对其进行增强操作(增强就是在目标就去的前面,后面,返回处,异常处添加额外的功能操作)。
②:cglib动态代理,它不是jdk中自带的代理技术
③: Cglib动态代理,是根据目标对象的字节码来进行修改,并产生一个子类。从而达到增强的效果。
④:new MethodInterceptor()接口:作用和invocationHandler接口功能一致
⑤:intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)方法
参数一:cglib产生的代理对象实例
参数二:调用的方法的反射对象实例
参数三:调用方法时,传递参数
参数四:调用的方法反射对象实例的代理对象
返回值:返回值就是调用代理方法时的返回值
注意:在该方法中增强部分,有关异常的出路需要throw e,对异常进行处理
⑥:创建Cglib代理对象实例—>enhancer.create();

Cglib动态代理的优点:Cglib动态代理要比Jdk动态代理要强,因为它可以在没有接口的情况下。也可以对对象进行增强操作。
缺点:不管是Jdk动态代理,还是Cglib动态代理。都需要我们自己编码去实现这些增强操作。

代码演示:

public static Object createCglibProxy(Object target) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());

enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
try {
//前置通知
LogUtils.logBefore(method.getName(), args);
Object result = method.invoke(target, args);
//返回通知
LogUtils.logAfterReturning(method.getName(), result);
return result;
} catch (Exception e) {
//异常通知
LogUtils.logAfterThrowing(method.getName(), e);
throw e;
}
}
});
return enhancer.create();
}


    你可能想看:

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

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

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

    分享给朋友:

    “jdk动态代理和cglib动态代理介绍” 的相关文章

    如何优化网络体验:VPS中转全面指南

    我一直对如何使用技术来优化我的网络体验感到好奇。最近,我发现了VPS中转这种神奇的方法。简单来说,VPS中转就是利用一台虚拟私人服务器(VPS),将我的网络流量转发到另一个指定的网络地址。这种功能主要用于加速访问某些海外网站,帮助我突破网络限制以及保护我的上网隐私等。 在日常使用中,我会遇到一些网站...

    甲骨文云账号如何注销:详尽步骤与注意事项

    甲骨文云账号注销流程 注销甲骨文云账号的流程其实并不复杂,但有几个关键步骤需要认真对待。整个过程主要分为几个部分,包括登录甲骨文云控制台、发起注销请求、查看注销请求状态,以及最后的等待和确认删除。 1.1 甲骨文云控制台的登录 进入甲骨文云控制台的第一步,就是要登录到你的账号。打开浏览器,访问甲骨文...

    域名注册商选择指南:如何找出最佳域名注册商

    域名注册商是帮助个人和企业在互联网中获取唯一标识的机构或公司。简而言之,域名注册商提供域名注册、管理和保护的服务。通过这些服务,我们可以确保域名的合法性和有效性,维护我们的在线身份。在现代网络环境中,拥有一个合适的域名是构建品牌形象和促进业务发展的重要一步。 在选择域名注册商时,首先要考虑它们在市场...

    Rackdog:高性价比的独立服务器租赁和托管解决方案

    Rackdog是一家充满活力的基础设施即服务(IaaS)提供商,成立于2020年。作为互联网时代的重要角色,Rackdog专注于独立服务器出租和托管业务,拥有一系列丰富的服务。通过自己的设备和网络架构,Rackdog正在为客户提供优质的托管解决方案。 Rackdog的AS号是AS398465,拥有多...

    如何选择适合的免费服务器:开发者与小团队的最佳指南

    免费服务器概述 在如今的数字时代,免费服务器成为了许多开发者和企业的热门选择。我们常常需要一些力量来支撑我们的项目,而这时候,免费服务器就能提供一个很好的解决方案。简单来说,免费服务器是一种不需要支付费用的虚拟专用服务器,允许用户在一定的使用条件下进行开发、测试或运行小型项目。 我记得刚接触云计算时...

    机房迁移全攻略:确保系统安全与顺利过渡的最佳实践

    机房迁移是一个涉及将数据中心内各种设备从一个地点转移到另一个地点的复杂过程。具体包括服务器、存储设备以及网络设备等。这样的迁移通常不仅仅是物理搬运,还涉及到设备的断电、拆卸、运输、重新安装与最后的测试,确保系统在新环境中能够正常运行。对于企业而言,这一过程对运营的影响极小,数据的安全性必须得到保障,...