温馨提示×

温馨提示×

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

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

java Proxy代理怎么用

发布时间:2026-09-19 11:26:25 来源:亿速云 阅读:88 作者:小樊 栏目:编程语言

在 Java 中,“Proxy 代理”通常有两种常见含义:

  1. JDK 动态代理(java.lang.reflect.Proxy) —— 面向接口的动态代理(AOP、RPC 常用)
  2. CGLIB / Byte Buddy 等第三方代理(不要求接口)

下面重点讲 JDK Proxy(最常用、面试常考) 的用法。


一、JDK 动态代理基本用法

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 target = new UserServiceImpl();

        UserService proxy = (UserService) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new MyInvocationHandler(target)
        );

        proxy.save("张三");
    }
}

✅ 输出

方法执行前
保存用户:张三
方法执行后

二、Proxy.newProxyInstance 参数说明

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

⚠️ 注意

  • JDK 动态代理 只能代理接口
  • 代理对象是接口的实现类(不是原类)

三、典型使用场景

  • ✅ Spring AOP
  • ✅ 事务管理
  • ✅ 日志 / 权限 / 监控
  • ✅ RPC 远程调用(如 Feign)

四、如果类没有接口怎么办?

✅ 方案 1:CGLIB(Spring 默认)

// 需要引入 cglib 或 spring-core

✅ 方案 2:改成接口 + 实现类(推荐)


五、简单对比

代理方式 是否需接口 性能 使用难度
JDK Proxy ✅ 必须 较高 简单
CGLIB ❌ 不需要 稍低 中等

如果你愿意,我可以:

  • ✅ 给你一个 Spring AOP 中的 Proxy 示例
  • ✅ 讲 JDK Proxy 原理(字节码层面)
  • ✅ 对比 JDK Proxy vs CGLIB

你想看哪一个?

向AI问一下细节

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

AI
助
手