千家信息网

如何用Java实现动态代理

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容介绍了"如何用Java实现动态代理"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录前言静态
千家信息网最后更新 2026年11月01日如何用Java实现动态代理

本篇内容介绍了"如何用Java实现动态代理"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

目录
  • 前言

  • 静态代理

  • 动态代理

  • CGLib实现动态代理

  • 总结

前言

动态代理在Java中有着广泛的应用,比如Spring AOP、Hibernate数据查询、测试框架的后端mock、RPC远程调用、Java注解对象获取、日志、用户鉴权、全局性异常处理、性能监控,甚至事务处理等。

代理,指的是使用代理对象代替对其它对象的访问,简单点说,你求职时找的中介就是代理,那么在Java中,代理如何体现呢?

静态代理

我们首先需要知道,何为静态代理?静态代理指的是在编译期就对目标对象的方法进行增强,例如:

public class TestDemo {    interface EmailService {        void sendEmail(String emailContent);    }    static class EmailServiceImpl implements EmailService{        @Override        public void sendEmail(String emailContent) {            System.out.println("发送了一封邮件,内容为:" + emailContent);        }    }    public static void main(String[] args) {        EmailService emailService = new EmailServiceImpl();        emailService.sendEmail("hello");    }}

现在若是想在发送邮件之前获取一下当前的时间,则可以使用代理类对发邮件的方法进行增强:

public class TestDemo {    interface EmailService {        void sendEmail(String emailContent);    }    static class EmailServiceImpl implements EmailService{        @Override        public void sendEmail(String emailContent) {            System.out.println("发送了一封邮件,内容为:" + emailContent);        }    }    static class EmailProxy implements EmailService{        private final EmailService emailService;        public EmailProxy(EmailService emailService) {            this.emailService = emailService;        }        @Override        public void sendEmail(String emailContent) {            System.out.println(LocalDateTime.now());            emailService.sendEmail(emailContent);        }    }    public static void main(String[] args) {        EmailService emailProxy = new EmailProxy(new EmailServiceImpl());        emailProxy.sendEmail("hello");    }}

静态代理的缺点非常明显,编写麻烦,且可扩展性不强,而动态代理的出现,将彻底解决这些问题。

动态代理

动态代理与静态代理恰恰相反,动态代理是在运行期对目标对象的某个方法进行增强,比如仍然是发邮件的服务,使用动态代理,即可这样实现:

public class TestDemo {    interface EmailService {        void sendEmail(String emailContent);    }    static class EmailServiceImpl implements EmailService {        @Override        public void sendEmail(String emailContent) {            System.out.println("发送了一封邮件,内容为:" + emailContent);        }    }    public static void main(String[] args) {        EmailService emailService = new EmailServiceImpl();        EmailService emailProxy = (EmailService) Proxy.newProxyInstance(EmailServiceImpl.class.getClassLoader(), EmailServiceImpl.class.getInterfaces(), new InvocationHandler() {            @Override            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                System.out.println(LocalDateTime.now());                Object result = method.invoke(emailService, args);                return result;            }        });        emailProxy.sendEmail("hello");    }}

使用JDK提供的Proxy和InvocationHandler类能够轻松实现动态代理,但这种方式也是有局限性的,就是被增强的类必须实现了接口,因为Proxy的参数中需要接收类的接口信息。

CGLib实现动态代理

CGLib的出现,打破了这一僵局,使用CGLib,能够增强任意的对象方法,即使你没有实现任何接口,因为它是通过继承的方式进行增强的。

下面就来演示一下如何使用CGLib,首先引入依赖:

    cglib    cglib    3.3.0

实现如下:

public class TestDemo {    static class EmailServiceImpl {        public void sendEmail(String emailContent) {            System.out.println("发送了一封邮件,内容为:" + emailContent);        }    }    public static void main(String[] args) {        EmailServiceImpl emailService = new EmailServiceImpl();        EmailServiceImpl emailProxy = (EmailServiceImpl) Enhancer.create(emailService.getClass(), new MethodInterceptor() {            @Override            public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {                System.out.println(LocalDateTime.now());                Object obj = methodProxy.invokeSuper(o, args);                return obj;            }        });        emailProxy.sendEmail("hello");    }}

它的写法与JDK提供的方式类似,通过Enhancer类的create()方法即可增强一个对象,并传入对象的Class对象和一个MethodInterceptor接口的实现类,并在intercept()方法中对原方法进行增强。

"如何用Java实现动态代理"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

代理 动态 对象 方法 邮件 内容 静态 接口 方式 前言 就是 是在 更多 目标 知识 处理 实用 明显 学有所成 接下来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海睿民互联网科技有限公司 易互联网科技有限公司 极限挑战互联网科技 互联网金融 科技创新 互联网科技公司名称 湖南一路畅行互联网科技 崇明区互联网教育科技售后服务 辽宁互联网新科技 中和天地互联网科技有限公司 华中科技大学互联网的牛人 国大互联网教育科技有限公司薪资 互联网方面的科技前沿 领航科技大厦互联网公司 互联网风格科技公司名称 广州互联网高科技取餐柜 全球科技与互联网公司市值变化 悟空问答互联网科技 互联网科技创业计划的风险分析 互联网的黑科技实验室 互联网大会出现的黑科技 科技金融是不是互联网金融 易通互联网络科技有限公司 联恩商钥互联网科技有限公司 开启互联网科技时代小说 科技赋能视角下互联网保险发展 江苏苏星互联网科技有限公司 电子商务与互联网科技的关系 昆明中奇联合互联网科技 普陀区互联网教育科技管理办法 北京品多多互联网科技有限公司
0