广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java实现动态代理的实例代码
  • 801
分享到

Java实现动态代理的实例代码

Python 官方文档:入门教程 => 点击学习

摘要

目录前言静态代理 动态代理 CGLib实现动态代理 总结前言 动态代理在Java中有着广泛的应用,比如spring aop、Hibernate数据查询、测试框架的后端mock、rpc

前言

动态代理在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,首先引入依赖:


<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.3.0</version>
</dependency>

实现如下:


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实现动态代理的文章就介绍到这了,更多相关Java实现动态代理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java实现动态代理的实例代码

本文链接: https://www.lsjlt.com/news/137021.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java实现动态代理的实例代码
    目录前言静态代理 动态代理 CGLib实现动态代理 总结前言 动态代理在Java中有着广泛的应用,比如Spring AOP、Hibernate数据查询、测试框架的后端mock、RPC...
    99+
    2022-11-12
    java实现动态代理的方式 java实现动态代理代码 java的动态代理
  • java动态代理实现代码
    目录1、代理模式2、动态代理3、原理研究4、应用5、总结1、代理模式 代理模式是常用的设计模式之一,也是开发中常见的设计模式。 简单的描述一下,代理模式就是将实现类隔离开,比如你想给...
    99+
    2022-11-12
    java动态代理 java代码
  • 代理模式:JAVA静态代理和动态代理的实例和实现详解
    目录前言静态代理实现简述创建human接口创建接口实现类创建针对接口实现增强操作的代理代理实现效果动态代理实现简述要点:向上转型创建YoungMan接口创建两个接口实现类创建动态代理...
    99+
    2022-11-12
    JAVA静态代理 JAVA动态代理
  • Java动态代理与静态代理实例分析
    这篇文章主要介绍了Java动态代理与静态代理实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java动态代理与静态代理实例分析文章都会有所收获,下面我们一起来看看吧。一、静态代理静态代理的使用静态代理,代...
    99+
    2023-07-02
  • Spring Core动态代理的实现代码
    目录1.设计原理2.ProxyFactory (Spring-Core)2.1 JdkDynamicAopProxy2.2 CglibAopProxy2.3 主要源码部分1.设计原理...
    99+
    2022-11-12
    Spring Core动态代理
  • Java实例讲解动态代理
    JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 CGlib动态代理:利用ASM(开源的Java字节码编辑库,操作字节...
    99+
    2022-11-13
    Java 动态代理 Java 动态代理原理
  • java 多态实例代码
    多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。多态性是对象多种表现形式的体现,比如:在现实中,我们按下F1键这个动作:如果当前在Flash界面下弹出的就是AS 3的帮助文档如果当前在Wo...
    99+
    2023-05-30
  • Android 动态菜单实现实例代码
    Android 动态菜单 先上效果图 比较简单,主要就是属性动画的使用和坐标角度的小细节。 实现 实现效果: 图标按照路径一路缩放渐变过来即可。 核心代码 pri...
    99+
    2022-06-06
    菜单 动态 Android
  • 浅谈Java动态代理的实现
    目录一、代理设计模式1.1 什么是代理1.2 代理模式入门二、Java代理的三种实现2.1 静态代理2.2 Java自带的动态代理2.3 cglib实现动态代理三...
    99+
    2022-11-12
    Java动态代理的实现 java动态代理
  • java动态代理的实现方法
    这篇文章主要介绍“java动态代理的实现方法”,在日常操作中,相信很多人在java动态代理的实现方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java动态代理的实现方法”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • Java注解实现动态数据源切换的实例代码
    当一个项目中有多个数据源(也可以是主从库)的时候,我们可以利用注解在mapper接口上标注数据源,从而来实现多个数据源在运行时的动态切换。实现原理在Spring 2.0.1中引入了AbstractRoutingDataSource, 该类充...
    99+
    2023-05-31
    java 数据源 切换
  • Java动态代理如何实现
    本篇内容介绍了“Java动态代理如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!JDK动态代理:利用反射机制生成一个实现代理接口的匿名...
    99+
    2023-06-30
  • Java动态代理机制的实例详解
     Java动态代理机制在学习spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功...
    99+
    2023-05-31
    java 动态代理 ava
  • Element实现动态表格的示例代码
    目录【代码背景】【代码实现】#1# -> 代码复用的基础是你需要一个可复用的组件#2# -> 在展示页面使用动态表格组件#3# -> 如何给动态表格根据需求动态添加...
    99+
    2022-11-12
    Element 动态表格
  • 使用Java怎么实现静态代理和动态代理
    本篇文章为大家展示了使用Java怎么实现静态代理和动态代理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。代理模式代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。主要解决:在直接...
    99+
    2023-06-14
  • java proxy动态代理怎么实现
    在Java中,可以通过使用`java.lang.reflect.Proxy`类来实现动态代理。首先,需要定义一个接口,代表被代理类和...
    99+
    2023-09-09
    java
  • Java中怎么实现动态代理
    今天就跟大家聊聊有关Java中怎么实现动态代理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、概述 代理是一种设计模式,其目的是为其他对象提供一个代理以控制对某个对象的访问,代理类...
    99+
    2023-06-17
  • Java如何实现JDK动态代理
    这篇文章主要讲解了“Java如何实现JDK动态代理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java如何实现JDK动态代理”吧!概念代理:为控制A对象,而创建出新B对象,由B对象代替执行...
    99+
    2023-07-02
  • vue+element实现动态换肤的示例代码
    有时候一个项目的主题并不能满足所有人的审美,这时候换肤功能就很友好,本项目基于vue+element实现后台管理项目的换肤功能 1.创建换肤组件 <template>...
    99+
    2022-11-12
    vue element动态换肤 vue element 换肤
  • ReactNative中实现动态导入的示例代码
    目录背景多业务包动态导入Metro 打包原理打包过程bundle 分析__d函数__r函数方案设计分识别入口树拆分bundle 生成合总结背景 随着业务的发展,每一个 React N...
    99+
    2022-11-13
    React Native动态导入 React Native 导入 React Native
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作