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();
}
}