温馨提示×

温馨提示×

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

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

java Proxy 代理有何用

发布时间:2026-10-09 16:08:20 来源:亿速云 阅读:92 作者:小樊 栏目:编程语言

在 Java 中,Proxy(代理) 主要有以下几种含义和用途,最常见的是 JDK 动态代理(java.lang.reflect.Proxy),此外还有 CGLIB 代理、静态代理 等。下面重点说明 Java 动态代理的作用和使用场景。


一、Java Proxy 是干什么的?

Proxy 的核心作用:

在不修改原有类代码的前提下,对目标对象的方法进行增强(拦截、控制、扩展)。

简单说:
你调用的是“代理对象”,但实际执行的是“真实对象”,中间可以加逻辑。


二、典型使用场景

1️⃣ AOP(面向切面编程)

最典型的例子就是 Spring AOP。

例如:

  • 方法执行前:开启事务
  • 方法执行后:提交 / 回滚事务
  • 方法异常:记录日志
public Object invoke(Object proxy, Method method, Object[] args) {
    System.out.println("前置逻辑");
    Object result = method.invoke(target, args);
    System.out.println("后置逻辑");
    return result;
}

✅ 不需要改业务代码


2️⃣ 事务管理

@Transactional
public void transfer() {
    ...
}

Spring 就是通过 Proxy 在方法前后自动管理事务。


3️⃣ 日志 / 监控 / 权限控制

  • 记录方法耗时
  • 校验用户权限
  • 接口限流
long start = System.currentTimeMillis();
Object result = method.invoke(target, args);
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));

4️⃣ 远程调用(RPC)

例如:

  • 本地调用 userService.getUser()
  • 实际是通过代理发 HTTP / TCP 请求到远程服务
proxy.getUser(id)  →  网络请求  →  远程服务

5️⃣ 延迟加载(Lazy Loading)

Proxy.newProxyInstance(...)

只有在真正调用方法时才去加载真实对象。


三、JDK 动态代理的特点

✅ 优点

  • 无需写代理类
  • 运行期动态生成
  • 非常适合 AOP

❌ 限制

  • 只能代理接口
  • 类必须实现接口
public class UserServiceImpl implements UserService {
}
Proxy.newProxyInstance(
    classLoader,
    new Class[]{UserService.class},
    invocationHandler
);

四、与 CGLIB 的区别(简单对比)

对比项 JDK Proxy CGLIB
原理 接口代理 继承类
是否需接口 ✅ 必须 ❌ 不需要
性能 稍慢 稍快
Spring 使用 有接口时用 无接口时用

五、一个最小示例

interface Service {
    void say();
}

class RealService implements Service {
    public void say() {
        System.out.println("hello");
    }
}

Service proxy = (Service) Proxy.newProxyInstance(
    RealService.class.getClassLoader(),
    new Class[]{Service.class},
    (p, method, args) -> {
        System.out.println("before");
        Object r = method.invoke(new RealService(), args);
        System.out.println("after");
        return r;
    }
);

proxy.say();

六、总结一句话

Java Proxy 的作用:在运行期为接口创建代理对象,用来对方法调用进行统一拦截和增强。

如果你愿意,我也可以:

  • 讲 Spring 中 Proxy 是怎么用的
  • 对比 静态代理 vs 动态代理
  • 用 真实项目例子 说明

你想看哪一种?

向AI问一下细节

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

AI
助
手