温馨提示×

温馨提示×

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

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

java Proxy代理静态和动态区别

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

在 Java 中,代理(Proxy) 是一种设计模式,用于在不修改目标对象代码的情况下,对其方法进行增强(如日志、事务、权限控制等)。

Java 中的代理主要分为 静态代理 和 动态代理,它们的核心区别如下:


一、静态代理(Static Proxy)

1️⃣ 原理

在编译期就手动编写代理类,代理类与目标类实现相同的接口。

2️⃣ 示例

interface UserService {
    void save();
}

class UserServiceImpl implements UserService {
    public void save() {
        System.out.println("保存用户");
    }
}

class UserServiceProxy implements UserService {
    private UserService target;

    public UserServiceProxy(UserService target) {
        this.target = target;
    }

    public void save() {
        System.out.println("前置增强");
        target.save();
        System.out.println("后置增强");
    }
}

3️⃣ 特点

✅ 简单直观
❌ 代理类需手动编写
❌ 接口一变,代理类也要改
❌ 类数量多,维护困难


二、动态代理(Dynamic Proxy)

1️⃣ 原理

在运行时动态生成代理类,不需要手写代理类。

Java 中常见两种方式:

  • JDK 动态代理(基于接口)
  • CGLIB 动态代理(基于继承)

2️⃣ JDK 动态代理示例

import java.lang.reflect.*;

interface UserService {
    void save();
}

class UserServiceImpl implements UserService {
    public void save() {
        System.out.println("保存用户");
    }
}

class MyInvocationHandler implements InvocationHandler {
    private Object target;

    public MyInvocationHandler(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;
    }
}

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

3️⃣ 特点

✅ 不需要手写代理类
✅ 一个处理器可代理多个类
✅ 易于扩展和维护
❌ JDK 动态代理只能代理接口


三、静态代理 vs 动态代理 对比

对比项 静态代理 动态代理
代理类生成时机 编译期 运行期
是否手写代理类 是 否
灵活性 低 高
可维护性 差 好
实现方式 手动实现接口 反射 / 字节码
典型应用 简单场景 Spring AOP

四、补充:CGLIB 动态代理

  • 不需要接口
  • 通过继承目标类生成子类
  • Spring AOP 默认在无接口时使用 CGLIB

五、总结一句话

静态代理是“写死”的,动态代理是“运行时生成”的;动态代理更灵活,是现代框架(如 Spring)的核心基础。

如果你愿意,我也可以帮你画一张对比图或结合 Spring AOP 讲得更深入。

向AI问一下细节

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

AI
助
手