温馨提示×

温馨提示×

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

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

Java Proxy 代理怎么入门

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

Java 中的 Proxy(代理) 通常有两种常见含义,入门时建议先分清:

  1. JDK 动态代理(java.lang.reflect.Proxy):运行时动态生成代理类,常用于 AOP、事务、日志等
  2. CGLIB / 第三方代理库:基于继承的代理(Spring 常用)

下面以 JDK 动态代理 为主,带你从 0 入门。


一、代理是解决什么问题的?

核心思想:

在不修改原类代码的情况下,增强或控制方法调用

典型场景:

  • 方法前后打印日志
  • 权限校验
  • 事务开启 / 提交
  • 远程调用(RPC)

二、JDK 动态代理的核心要素

JDK 动态代理必须满足条件:

✅ 被代理类必须实现接口

涉及三个关键角色:

角色 说明
接口 定义业务方法
被代理类 真实实现
InvocationHandler 代理逻辑

三、最简单示例(一步一步来)

1️⃣ 定义接口

public interface UserService {
    void save(String name);
}

2️⃣ 真实实现类

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

3️⃣ 编写代理逻辑(InvocationHandler)

import java.lang.reflect.*;

public class LogHandler implements InvocationHandler {

    private Object target; // 被代理对象

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

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before:" + method.getName());
        Object result = method.invoke(target, args);
        System.out.println("after:" + method.getName());
        return result;
    }
}

4️⃣ 使用 Proxy 创建代理对象

import java.lang.reflect.*;

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("张三");
    }
}

5️⃣ 运行结果

before:save
保存用户:张三
after:save

✅ 你没有改 UserServiceImpl,但方法被“增强”了


四、Proxy.newProxyInstance 参数解释

Proxy.newProxyInstance(
    ClassLoader loader,     // 类加载器
    Class<?>[] interfaces,  // 代理接口
    InvocationHandler h     // 代理逻辑
)

五、常见误区(新手必看)

❌ 代理类不能强转成实现类

UserServiceImpl s = (UserServiceImpl) proxy; // 错误

❌ 只能代理接口,不能代理普通类(JDK 限制)

✅ 想代理类 → 用 CGLIB


六、和 Spring AOP 的关系

Spring AOP 底层其实就是:

  • 有接口 → JDK 动态代理
  • 无接口 → CGLIB

你学会 JDK Proxy,就懂了 AOP 一半原理。


七、学习路线建议

  1. 会写 JDK 动态代理 ✅
  2. 理解 InvocationHandler
  3. 看 Spring AOP 源码
  4. 了解 CGLIB
  5. 尝试自己写一个“迷你 AOP”

如果你愿意,我可以:

  • 用 生活化比喻 再讲一遍
  • 给你 面试版总结
  • 对比 JDK Proxy vs CGLIB
  • 写一个 Spring AOP 实战例子

你想从哪个角度继续?

向AI问一下细节

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

AI
助
手