温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java Proxy 代理怎么实现

发布时间:2026-08-31 23:05:58 来源:亿速云 阅读:98 作者:小樊 栏目:编程语言

在 Java 中,**Proxy(代理)**通常有两种主流实现方式:

  1. JDK 动态代理(基于接口)
  2. CGLIB 动态代理(基于继承)

下面分别说明,并给出示例。


一、JDK 动态代理(官方自带)

特点

  • 只能代理 接口
  • 使用 java.lang.reflect.Proxy
  • 必须实现 InvocationHandler

示例

1. 定义接口

public interface UserService {
    void save();
}

2. 实现类

public class UserServiceImpl implements UserService {
    @Override
    public void save() {
        System.out.println("保存用户");
    }
}

3. 代理处理器

import java.lang.reflect.*;

public class MyInvocationHandler implements InvocationHandler {

    private Object target;

    public MyInvocationHandler(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;
    }
}

4. 使用代理

public class Test {
    public static void main(String[] args) {
        UserService target = new UserServiceImpl();
        UserService proxy = (UserService) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new MyInvocationHandler(target)
        );
        proxy.save();
    }
}

二、CGLIB 动态代理(第三方库)

特点

  • 可以代理 类(无需接口)
  • 通过继承目标类实现
  • 不能代理 final 类或方法

Maven 依赖

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.3.0</version>
</dependency>

示例

目标类

public class UserService {
    public void save() {
        System.out.println("保存用户");
    }
}

方法拦截器

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

public class MyInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("前置增强");
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("后置增强");
        return result;
    }
}

使用代理

import net.sf.cglib.proxy.Enhancer;

public class Test {
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(UserService.class);
        enhancer.setCallback(new MyInterceptor());

        UserService proxy = (UserService) enhancer.create();
        proxy.save();
    }
}

三、JDK Proxy vs CGLIB 对比

对比项 JDK Proxy CGLIB
是否需接口 ✅ 需要 ❌ 不需要
实现方式 反射 字节码增强
性能 较低(反射) 较高
final 类 不支持 不支持

四、常见使用场景

  • Spring AOP
  • 事务管理
  • 日志、权限、监控
  • RPC 框架(如 Dubbo)

如果你是想了解 Spring 中的 Proxy 原理 或 手写简易 Proxy,也可以继续问我。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手