cglib动态代理

依赖

<dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib-nodep</artifactId>
      <version>3.2.4</version>
    </dependency>

代理类

package com.test.cglibProxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.Date;

//代理对象生成器
public class CglibProxy  implements MethodInterceptor {

    //创建目标对象的代理对象 并且拦截目标对象中的方法
    Enhancer enhancer=new Enhancer();

    public Object getProxy(Class clazz)
    {
         //设置目标对象的字节码文件为代理对象的父类
         enhancer.setSuperclass(clazz);
         //设置回调函数  目的是调用intercept方法
         enhancer.setCallback(this);
         //根据传递过去的参数 创建一个代理对象 返回
         return enhancer.create();
    }

    //重写 拦截了目标方法以后 做什么事情
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

        System.out.println("方法执行前:"+new Date());
        Object result= methodProxy.invokeSuper(o,objects);
        System.out.println("方法执行后:"+new Date());
        return result;
    }
}

目标类

package com.test.cglibProxy;

//目标类
public class UsersService {

    public void insert() {
        System.out.println("添加用户");
    }
}

测试

package com.test.cglibProxy;

import org.junit.Test;

public class TestCglibProxy {

    @Test
    public void  test()
    {
        CglibProxy cglibProxy=new CglibProxy();

        //创建一个代理对象 用 目标对象的类型来接收(子类对象可以赋给父类引用)
        UsersService usersServiceProxy=(UsersService)cglibProxy.getProxy(UsersService.class);

        //调用的是代理对象的方法
        usersServiceProxy.insert();
    }
}