温馨提示×

温馨提示×

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

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

Java Proxy 代理怎么用

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

在 Java 中,Proxy(代理)通常指 JDK 动态代理(java.lang.reflect.Proxy),用来在运行时为接口创建代理对象,从而在方法调用前后插入额外逻辑(如日志、事务、权限等)。

下面从 是什么 → 怎么用 → 示例 → 注意事项 讲清楚。


一、Proxy 是什么

  • JDK 动态代理 只能代理接口
  • 核心类:java.lang.reflect.Proxy
  • 核心接口:InvocationHandler

结构关系:

接口 A
  ↑
代理对象(Proxy)
  ↑
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.InvocationHandler;
import java.lang.reflect.Method;

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

import java.lang.reflect.Proxy;

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 MyInvocationHandler(userService)
        );

        proxy.save("Tom");
    }
}

✅ 输出

方法执行前
保存用户:Tom
方法执行后

三、Proxy.newProxyInstance 参数说明

Proxy.newProxyInstance(
    ClassLoader loader,        // 类加载器
    Class<?>[] interfaces,     // 要代理的接口
    InvocationHandler h        // 调用处理器
)

四、常见使用场景

✅ AOP(切面编程)
✅ 事务管理
✅ 日志记录
✅ 权限校验
✅ RPC 框架(如 Feign)


五、JDK Proxy 的限制

❌ 不能代理类,只能代理接口
❌ 性能比直接调用略低
✅ 无需第三方依赖

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

  • CGLIB
  • Byte Buddy
  • Spring AOP(默认 JDK + CGLIB)

六、Spring 中的 Proxy(简单了解)

@Transactional
public void method() {}

Spring 背后就是:

  • 有接口 → JDK Proxy
  • 无接口 → CGLIB

七、总结一句话

Java Proxy = 给接口创建“包装对象”,在方法调用前后做增强

如果你愿意,我可以:

  • 给你画一张 代理调用流程图
  • 对比 JDK Proxy vs CGLIB
  • 写一个 完整 AOP 小框架示例

你想看哪一个?

向AI问一下细节

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

AI
助
手