温馨提示×

温馨提示×

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

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

Java Proxy 代理如何学习

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

学习 Java 中的 Proxy(代理),建议按「概念 → 分类 → 动态代理 → 实战 → 源码/原理」的路线循序渐进。下面给你一个系统学习路线和内容清单。


一、先搞清楚:什么是代理(Proxy)

代理模式(Proxy Pattern) 是一种设计模式:

为其他对象提供一种代理,以控制对这个对象的访问。

核心作用:

  • 控制访问(权限、远程调用)
  • 增强功能(日志、事务、监控)
  • 解耦调用方和目标对象

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

1️⃣ 静态代理(手写代理类)

特点

  • 代理类和目标类都要实现同一接口
  • 编译期就确定

示例:

interface UserService {
    void save();
}

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

class UserServiceProxy implements UserService {
    private UserService target;

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

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

✅ 适合理解代理思想
❌ 不灵活,类会爆炸


2️⃣ JDK 动态代理(重点)

核心类

  • java.lang.reflect.Proxy
  • InvocationHandler

特点

  • 运行时生成代理类
  • 只能代理接口

示例:

UserService proxy = (UserService) Proxy.newProxyInstance(
    target.getClass().getClassLoader(),
    new Class[]{UserService.class},
    (proxy1, method, args) -> {
        System.out.println("前置增强");
        Object result = method.invoke(target, args);
        System.out.println("后置增强");
        return result;
    }
);

✅ Spring AOP 底层之一
✅ 必须掌握


3️⃣ CGLIB 动态代理

特点

  • 通过继承目标类生成代理
  • 可代理类(无接口也可)
  • Spring Boot 默认常用

示例(简化):

Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class);
enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> {
    System.out.println("增强");
    return proxy.invokeSuper(obj, args);
});
UserService proxy = (UserService) enhancer.create();

✅ 理解 Spring AOP 必学
❌ 不能代理 final 类/方法


三、JDK 动态代理核心学习点(重点)

必须掌握:

  1. InvocationHandler 的作用
  2. Proxy.newProxyInstance 参数含义
  3. 方法调用是如何转发到 handler 的
  4. 代理对象类型 ≠ 目标类

常见面试题:

  • JDK 动态代理为什么只能代理接口?
  • 代理对象是如何生成的?
  • method.invoke(target, args) 为什么不用 proxy?

四、结合框架学(非常重要)

Spring AOP

  • JDK 动态代理 vs CGLIB
  • @Transactional 原理
  • 自调用失效问题

MyBatis

  • Mapper 接口是如何被代理的

RPC 框架

  • 远程调用本质上是代理

五、推荐学习资源

官方文档

  • Java Reflection
  • Proxy (Java SE 8 Docs)

书籍

  • 《Java 编程思想》
  • 《Spring 技术内幕》
  • 《深入理解 Java 虚拟机》(代理类生成)

视频/博客

  • 尚硅谷 / 黑马 Java 反射与代理
  • 美团技术博客:Java 动态代理

六、学习路线建议(按周)

第 1 周

  • 静态代理
  • 反射基础
  • JDK 动态代理

第 2 周

  • CGLIB
  • Spring AOP
  • 手写简单 AOP

第 3 周

  • 阅读 Spring AOP 源码
  • 分析 MyBatis Mapper 代理

如果你愿意,我可以:

  • ✅ 帮你写一个完整 Proxy 示例工程
  • ✅ 用图文方式讲 JDK 动态代理原理
  • ✅ 结合 Spring 源码讲 AOP
  • ✅ 出一套代理模式练习题

你现在是入门 / 面试 / 框架源码哪个方向?

向AI问一下细节

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

AI