温馨提示×

温馨提示×

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

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

java Proxy代理原理是什么

发布时间:2026-09-19 12:14:28 来源:亿速云 阅读:100 作者:小樊 栏目:编程语言

Java 中的 Proxy(代理) 通常指 Java 动态代理(Dynamic Proxy),它是 Java 反射机制的重要应用之一,主要用于在运行时动态生成代理类,从而在不修改原始类代码的情况下,对方法调用进行拦截和增强。

下面从 原理、实现方式、使用场景 三个方面说明。


一、Java Proxy 的基本原理

1. 核心思想

代理对象代替真实对象接收方法调用,再由代理对象决定是否、如何调用真实对象。

调用关系如下:

客户端
  ↓
代理对象(Proxy)
  ↓(增强逻辑 + 调用)
真实对象(Real Object)

2. Java 动态代理的实现机制

Java 动态代理主要依赖:

  • java.lang.reflect.Proxy
  • java.lang.reflect.InvocationHandler

关键点

  • 运行时生成代理类
  • 代理类 继承自 Proxy
  • 代理类 实现你指定的接口
  • 所有接口方法的调用都会转发到 InvocationHandler.invoke()

二、动态代理的工作流程

1. 定义一个接口

public interface UserService {
    void save();
}

2. 实现真实对象

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

3. 实现 InvocationHandler

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. 创建代理对象

UserService proxy = (UserService) Proxy.newProxyInstance(
        UserService.class.getClassLoader(),
        new Class[]{UserService.class},
        new MyInvocationHandler(new UserServiceImpl())
);

proxy.save();

三、Proxy.newProxyInstance 内部做了什么?

简化流程如下:

  1. 校验接口
  2. 生成代理类的字节码
    • 类名通常是:$Proxy0
    • 继承 Proxy
    • 实现指定接口
  3. 通过类加载器加载代理类
  4. 创建代理实例
  5. 方法调用全部路由到 InvocationHandler

四、动态代理的限制

⚠️ Java 原生 Proxy 只能代理接口

  • ❌ 不能代理普通类
  • ✅ 只能代理 interface

如果需要代理类,需要使用:

  • CGLIB
  • Byte Buddy
  • AspectJ

五、动态代理 vs CGLIB 对比

对比项 Java Proxy CGLIB
代理方式 接口 类
是否依赖接口 是 否
性能 较低 较高
使用复杂度 低 稍高
Spring 默认 有接口用 Proxy 无接口用 CGLIB

六、典型使用场景

  • AOP(面向切面编程)
  • 事务管理
  • 日志记录
  • 权限校验
  • RPC 框架(如 Dubbo)
  • MyBatis Mapper 接口

七、一句话总结

Java Proxy 是通过反射在运行时生成接口代理类,将所有方法调用统一转发到 InvocationHandler,从而实现无侵入式功能增强。

如果你愿意,我也可以:

  • 画一张调用流程图
  • 对比 JDK Proxy 和 CGLIB 源码
  • 讲 Spring AOP 中 Proxy 的应用
向AI问一下细节

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

AI
助
手