spring框架中动态代理

动态代理

  • 基于接口的动态代理【Proxy类】
    提供者:JDK 官方的 Proxy 类。
    要求:被代理类最少实现一个接*
  • 基于子类的动态代理
    提供者:第三方的 CGLib,如果报 asmxxxx 异常,需要导入 asm.jar。
    要求:被代理类不能用 final 修饰的类(最终类)。**

一、使用 JDK 官方的 Proxy 类创建代理对象

被代理类 【他实现了接口】

final Actor actor = new Actor();

获取代理对象:

被代理类最少实现一个接口

创建的方式

Proxy.newProxyInstance(三个参数)
参数
ClassLoader:和被代理对象使用相同的类加载器。
Interfaces:和被代理对象具有相同的行为。实现相同的接口。
InvocationHandler:如何代理。

实现接口【Proxy类代理】

IActor proxyActor = (IActor) Proxy.newProxyInstance(
actor.getClass().getClassLoader(), 
actor.getClass().getInterfaces(), 
new InvocationHandler() {
##  执行被代理对象的任何方法,都会经过该方法。【 此方法有拦截的功能】

参数:
proxy:代理对象的引用。不一定每次都用得到
method:当前执行的方法对象
args:执行方法所需的参数
返回值:当前执行方法的返回值

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String name = method.getName();
Float money = (Float) args[0];
Object rtValue = null;}

使用CGLib 的 Enhancer类创建动态代理对象

  • 基于子类的动态代理
    要求:
    被代理对象不能是最终类
    用到的类:Enhancer
    用到的方法:create(Class Callback)
    方法的参数:Class:被代理对象的字
    Callback:如何

      final Actor actor = new Actor();
      Actor cglibActor = (Actor) Enhancer.create(actor.getClass(),
      					new MethodInterceptor(){
      @Override
      public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
       throws Throwable {
      	String name = method.getName();
      	Float money = (Float) args[0];
      	Object rtValue = nul
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值