温馨提示×

温馨提示×

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

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

Java Proxy 代理是什么

发布时间:2026-08-31 22:47:55 来源:亿速云 阅读:86 作者:小樊 栏目:编程语言

在 Java 中,Proxy(代理)是一种设计模式,也是 Java 标准库提供的一套机制,用来在运行时创建代理对象,从而在不修改原始类代码的情况下,对方法调用进行拦截、增强或控制

下面从“概念 → 分类 → 原理 → 示例 → 常见用途”来说明。


一、什么是 Java 代理(Proxy)

代理对象(Proxy)
对目标对象的一层“包装”,调用者先调用代理对象,代理对象再决定是否、如何调用真实对象。

核心目的

  • 不修改原有代码
  • 在方法执行前后插入逻辑(日志、事务、权限、监控等)

二、Java 中代理的两种主要方式

1️⃣ 静态代理(Static Proxy)

特点

  • 代理类在编译期就写好
  • 一个代理类通常只代理一个接口或类

示例

interface UserService {
    void save();
}

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

class UserServiceProxy implements UserService {
    private UserService target;

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

    public void save() {
        System.out.println("开始事务");
        target.save();
        System.out.println("提交事务");
    }
}

✅ 简单直观
❌ 接口一多,代理类爆炸


2️⃣ 动态代理(Dynamic Proxy)✅ 重点

Java 官方支持两种动态代理方式:


(1)JDK 动态代理(基于接口)

特点

  • 只能代理接口
  • 运行时生成代理类
  • 使用 java.lang.reflect.Proxy

核心类

  • Proxy.newProxyInstance(...)
  • InvocationHandler

示例

interface UserService {
    void save();
}

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

class LogHandler implements InvocationHandler {
    private Object target;

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

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("方法前:" + method.getName());
        Object result = method.invoke(target, args);
        System.out.println("方法后:" + method.getName());
        return result;
    }
}

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

✅ 灵活、无侵入
❌ 只能代理接口


(2)CGLIB 动态代理(基于继承)

特点

  • 可以代理普通类
  • 通过生成子类实现
  • 常用于 Spring AOP
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class);
enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> {
    System.out.println("before");
    Object result = proxy.invokeSuper(obj, args);
    System.out.println("after");
    return result;
});

三、Proxy 的典型应用场景

✅ Spring AOP
✅ 事务管理
✅ 权限校验
✅ 日志记录
✅ 远程调用(RPC)
✅ 接口限流、监控


四、一句话总结

Java Proxy 是一种在不修改原有代码的前提下,通过代理对象对方法调用进行拦截和增强的机制。

如果你愿意,我也可以:

  • 对比 JDK 动态代理 vs CGLIB
  • 讲 Spring AOP 中 Proxy 的原理
  • 手写一个简易 AOP 框架
向AI问一下细节

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

AI