【注:CGLIB代理不能代理final,static修饰的目标类】
目录结构:
需要四个jar包:asm.jar | asm-commons.jar | asm-tree.jar | cglib.jar
下载方式: 打开 https://mvnrepository.com/ 搜索对应的jar包下载,导入项目即可。
目标对象类:【UserService】
public class UserService {
public void AddUser(){
System.out.println("添加员工");
}
public void DeleteUser(){
System.out.println("删除员工成功");
}
}
代理工场类:【ProxyFactory】
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class ProxyFactory implements MethodInterceptor {
// 聚合目标对象
private UserService target;
// 代理工厂构造函数
public ProxyFactory(UserService target) {
this.target = target;
}
// 用户返回代理对象
public Object getProxyInstance(){
// 1. 创建一个工具类
Enhancer enhancer = new Enhancer();
// 2. 设置父类
enhancer.setSuperclass(target.getClass());
// 3. 设置回调函数
enhancer.setCallback(this);
// 4. 创建子类对象, 即代理对象
Object object = enhancer.create();
return object;
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
// 代理开始
System.out.println("代理开始");
// 执行目标对象方法
Object object = method.invoke(target,objects);
System.out.println("代理结束");
// 返回代理对象
return object;
}
}
测试类:【MyTest】
import org.junit.Test;
public class MyTest {
@Test
public void f(){
// 创建目标对象
UserService userService = new UserService();
// 创建代理工厂对象,返回代理对象 将目标对象作为参数传入
ProxyFactory proxyFactory = new ProxyFactory(userService);
// 通过工厂获得代理对象
UserService userServiceProxy = (UserService) proxyFactory.getProxyInstance();
// 执行代理对象方法
userServiceProxy.AddUser();
System.out.println("-----------------------");
userServiceProxy.DeleteUser();
}
}
测试结果: