jdk 动态代理的原理

jdk动态代理会动态写一个java文件(代理类 与目标类实现了同一个接口),还有一个声明类实例变量(invocationHandler)


jvm会自动生成一个Java文件 这个过程对用户不可见 这个生成类与目标类一样的接口,拥有invocationHandler这个实例变量,代理类每次调用方法 实际上都是调用这个InvocationHandler的invoke方法,在invoke方法里面加入一些横切逻辑代码即可实现aop功能。

所以我们来总结一下 spring 里面的aop原理,aop原理就是jdk动态代理或者cglib。jdk动态代理就是为目标对象(target)生成一个代理对象(proxy),通过java.lang.reflect.包里面的proxy类的静态方法 newProxyInstance 动态生成一个对象,代理对象根目标对象同样的接口,同样的方法,但是代理对象的方法的调用会委托给invocationHandler 里面的invoke方法,invoke方法里面就含有横切逻辑代码,和目标对象调用实际业务的代码。 invocationHandler里面有你想要调用的方法和目标对象,所以条用目标对象的时候采用反射机制 method.invoke(target)




cglib动态代理思想类似,动态代理生成的类继承目标类,调用方法要转到 MethodInterceptor 的intercept方法


cglib创建代理对象的几个步骤:

  • 生成代理类的二进制字节码文件(借助字节码生成框架asm 生成代理类的字节码);
  • 加载二进制字节码,生成Class对象( 例如使用Class.forName()方法 );
  • 通过反射机制获得实例构造,并创建代理类对象


MethodInterceptor接口的 intercept方法,intercept方法里面有横切逻辑代码
总结 jdk针对接口代理  cglib针对类代理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值