【2025版】JDK动态代理与CGLIB代理使用方法

文章目录

  • 一、静态代理
  • 二、JDK动态代理(基于接口)
  • 三、CGLIB代理(基于子类)

一、静态代理

  1. 定义接口和实现类:
public interface UserService {
    void addUser(String name);
}

public class UserServiceImpl implements UserService {
    @Override
    public void addUser(String name) {
        System.out.println("添加用户:" + name);
    }
}
  1. 创建代理类(实现相同接口):
public class UserServiceProxy implements UserService {
    private UserService target;

    public UserServiceProxy(UserService target) {
        this.target = target;
    }

    @Override
    public void addUser(String name) {
        System.out.println("开始添加用户");
        target.addUser(name);  // 调用目标方法
        System.out.println("添加用户完成");
    }
}
  1. 使用代理:
UserService target = new UserServiceImpl();
UserService proxy = new UserServiceProxy(target);
proxy.addUser("张三");  // 输出增强后的结果

二、JDK动态代理(基于接口)

  1. 定义接口和实现类:
public interface UserService {
    void addUser(String name);
}

public class UserServiceImpl implements UserService {
    @Override
    public void addUser(String name) {
        System.out.println("添加用户:" + name);
    }
}
  1. 实现 InvocationHandler
import java.lang.reflect.*;

public class LogHandler implements InvocationHandler {
    private Object target;

    public LogHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("方法调用前");
        Object result = method.invoke(target, args);  // 调用目标方法
        System.out.println("方法调用后");
        return result;
    }
}
  1. 生成代理对象:
UserService target = new UserServiceImpl();//这里用接口还是实现类来接收都行
UserService proxy = (UserService) Proxy.newProxyInstance(
    target.getClass().getClassLoader(),
    target.getClass().getInterfaces(),  // 代理的接口
    new LogHandler(target)
);
proxy.addUser("李四");  // 输出增强后的结果

如果目标对象实现了多个接口,想使用哪个接口的增强功能,只需要把LogService替换成那个接口就行
LogService proxy = (LogService)Proxy.newProxyInstance(...)

三、CGLIB代理(基于子类)

  1. 引入cglib依赖
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.3.0</version>
</dependency>
  1. 被代理的类
public class TargetClass {
    public void doSomething() {
        System.out.println("TargetClass is doing something.");
    }
}
  1. 创建方法拦截器

实现 MethodInterceptor 接口,定义代理逻辑:

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

public class MyMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        // 前置增强
        System.out.println("Before method: " + method.getName());
        
        // 调用原始方法
        Object result = proxy.invokeSuper(obj, args);
        
        // 后置增强
        System.out.println("After method: " + method.getName());
        return result;
    }
}
  1. 生成代理对象
import net.sf.cglib.proxy.Enhancer;

public class CglibDemo {
    public static void main(String[] args) {
        // 创建增强器
        Enhancer enhancer = new Enhancer();
        
        // 设置父类(被代理的类)
        enhancer.setSuperclass(TargetClass.class);
        
        // 设置回调(拦截器)
        enhancer.setCallback(new MyMethodInterceptor());
        
        // 创建代理对象
        TargetClass proxy = (TargetClass) enhancer.create();
        
        // 调用方法
        proxy.doSomething();
    }
}

你可能感兴趣的:(java,开发语言)