温馨提示×

温馨提示×

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

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

java Proxy 代理如何入门

发布时间:2026-10-09 14:18:17 来源:亿速云 阅读:97 作者:小樊 栏目:编程语言

在 Java 中,**Proxy(代理)**通常指两种东西,初学者容易混淆:

  1. JDK 动态代理(java.lang.reflect.Proxy)
  2. CGLIB / Byte Buddy 等第三方代理
  3. 更广义的“代理模式(Proxy Pattern)”

下面从最该先学的 JDK 动态代理 + 代理模式入门,循序渐进。


一、先理解“代理模式”是什么(很重要)

代理模式:

在不修改原对象代码的情况下,通过“代理对象”来控制对原对象的访问。

现实例子

  • 你租房 ➡ 中介(代理) ➡ 房东(真实对象)
  • 你访问数据库 ➡ MyBatis Mapper 代理 ➡ JDBC

二、JDK 动态代理入门(最推荐先学)

1️⃣ 核心接口:InvocationHandler

public interface InvocationHandler {
    Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}

2️⃣ 示例:最简单的动态代理

(1)定义接口

public interface UserService {
    void sayHello();
}

(2)真实实现类

public class UserServiceImpl implements UserService {
    public void sayHello() {
        System.out.println("Hello");
    }
}

(3)代理处理器

import java.lang.reflect.*;

public 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("前置逻辑");
        Object result = method.invoke(target, args);
        System.out.println("后置逻辑");
        return result;
    }
}

(4)创建代理对象

import java.lang.reflect.*;

public class Main {
    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.sayHello();
    }
}

✅ 输出:

前置逻辑
Hello
后置逻辑

三、JDK 动态代理的限制(新手必知)

⚠️ 只能代理接口

❌ 不能代理类
✅ 必须:

interface + implements

如果你要代理普通类,需要:

  • CGLIB
  • Byte Buddy
  • ASM

四、什么时候用代理?

✅ 非常适合:

  • 日志
  • 事务
  • 权限校验
  • 性能监控
  • AOP(Spring 核心)

Spring 的 @Transactional、@Cacheable 底层就是代理。


五、下一步学什么(路线建议)

入门路线

  1. ✅ 代理模式(UML + 例子)
  2. ✅ JDK 动态代理
  3. ✅ InvocationHandler 原理
  4. ✅ Spring AOP(基于代理)

进阶路线

  • CGLIB 动态代理
  • 静态代理 vs 动态代理
  • 代理在框架中的源码(Spring / MyBatis)

六、常见误区

❌ “代理就是反射”
✅ 代理 用了反射,但不等于反射

❌ “代理能增强任何类”
✅ JDK 代理只能增强接口


如果你愿意,我可以:

  • 用 Spring AOP 的方式再讲一遍
  • 对比 JDK 代理 vs CGLIB
  • 结合 MyBatis Mapper 代理讲实际用途

你更想从哪一块继续?

向AI问一下细节

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

AI
助
手