我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java中动态代理和静态代理的示例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java中动态代理和静态代理的示例分析

这篇文章主要介绍了Java中动态代理和静态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

    0、代理模式

    为什么要学习代理模式?这是SpringAOP的底层【SpringAOP和SpringMVC】

    代理模式的分类:

    • 静态代理

    • 动态代理

    1、静态代理

    静态代理中,我们对目标对象的每个方法的增强都是手动完成的(后面会具体演示代码_),非常不灵活(比如接口一旦新增加方法,目标对象和代理对象都要进行修改)且麻烦(_需要对每个目标类都单独写一个代理类)。 实际应用场景非常非常少,日常开发几乎看不到使用静态代理的场景。

    角色分析:

    • 抽象角色:一般会使用接口或者抽象类来解决

    • 真实角色:被代理的角色

    • 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作

    • 客户:访问代理对象的人!

    代码步骤:

    接口

    public interface Rent {    public void rent();}

    真实角色

    //房东public class Host implements Rent {    public void rent() {        System.out.println("房东要租房子");    }}

    代理角色

    public class Proxy implements Rent{    private Host host;    public Proxy() {    }    public Proxy(Host host) {        this.host = host;    }    public void rent(){        seeHouse();        host.rent();        fare();    }    //看房    public void seeHouse(){        System.out.println("中介带你看房");    }    //收中介费    public void fare(){        System.out.println("中介收费");    }}

    客服端访问代理角色

    public class Client {    public static void main(String[] args) {        Host host = new Host();        //代理,代理角色一般会有附属操作!        Proxy proxy = new Proxy(host);        proxy.rent();    }}

    代理模式的好处:

    • 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务

    • 公共也就交给代理角色!实现业务的分工!

    • 公共业务发生扩展的时候,方便集中管理!

    缺点:

    一个真实角色会产生一个代理角色;从JVM角度来看,静态代理在编译时就将接口、实现类、代理类这些都变成了一个个实际的class文件。

    2、 加深理解

    AOP,的底层代理模式

    Java中动态代理和静态代理的示例分析

    3、动态代理

    • 动态代理和静态代理角色一样

    • 动态代理的代理类是动态生成的,不是我们直接写好的!

    • 动态代理分为两大类:基于接口的动态代理,基于类的动态代理

      • 基于接口——JDK动态代理

      • 基于类:cglib动态代理

      • java字节码实现:javasist

    需要了解两个类:Proxy: 代理类,InvocationHandler : 调用处理程序

    从 JVM 角度来说,动态代理是在运行时动态生成类字节码,并加载到 JVM 中的。

    //Proxy是生成动态代理类,提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。//InvocationHandler-- invoke 调用处理程序并返回接口, 是由代理实例的调用处理程序实现的接口 。

    动态代理的好处:

    • 可以使真实角色的操作更加纯粹!不用去关系一些公共的业务

    • 公共也就交给代理角色!实现

    public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h){}

    1.loader :类加载器,用于加载代理对象。

    2.interfaces : 被代理类实现的一些接口;

    3.h : 实现了 InvocationHandler 接口的对象;

    要实现动态代理的话,还必须需要实现InvocationHandler 来自定义处理逻辑。 当我们的动态代理对象调用一个方法时,这个方法的调用就会被转发到实现InvocationHandler 接口类的 invoke 方法来调用。

    public interface InvocationHandler {    Object invoke(Object proxy, Method method, Object[] args) throws Throwable;}

    1.proxy :动态生成的代理类

    2.method : 与代理类对象调用的方法相对应

    3.args : 当前 method 方法的参数

    动态代理的例子

    定义接口

    public interface Rent {    public void rent();}

    实现租房的接口

    public class Host implements Rent {    @Override    public void rent() {        System.out.println("房东要租房");    }}

    定义一个JDK动态代理类

    public class DebugInvocationHandler implements InvocationHandler {        private final Object target;    public DebugInvocationHandler(Object target){        this.target = target;    }        @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        //调用方法前        System.out.println("before method" + method.getName());        Object res = method.invoke(target, args);        //调用方法后        System.out.println("after method" + method.getName());        return res;    }}

    invoke() 方法: 当我们的动态代理对象调用原生方法的时候,最终实际上调用到的是 invoke() 方法,然后 invoke() 方法代替我们去调用了被代理对象的原生方法。

    获取代理对象的工厂类

    public class JdkProxyFactory {    public static Object getProxy(Object target){        return Proxy.newProxyInstance(                target.getClass().getClassLoader(),                target.getClass().getInterfaces(),                new DebugInvocationHandler(target)        );    }}

    getProxy() :主要通过Proxy.newProxyInstance()方法获取某个类的代理对象

    实际使用

    public static void main(String[] args) {        //Rent rent = new Host();        //Rent rentProxy= (Rent) Proxy.newProxyInstance(rent.getClass().getClassLoader(), rent.getClass().getInterfaces(),new DebugInvocationHandler(rent));        Rent rentProxy = (Rent)JdkProxyFactory.getProxy(new Host());        rentProxy.rent();    }

    运行上述代理的输出

    before methodrent
    房东要租房
    after methodrent

    感谢你能够认真阅读完这篇文章,希望小编分享的“Java中动态代理和静态代理的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Java中动态代理和静态代理的示例分析

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

    下载Word文档

    猜你喜欢

    Java中动态代理和静态代理的示例分析

    这篇文章主要介绍了Java中动态代理和静态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。0、代理模式为什么要学习代理模式?这是SpringAOP的底层【Spri
    2023-06-29

    Java动态代理与静态代理实例分析

    这篇文章主要介绍了Java动态代理与静态代理实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java动态代理与静态代理实例分析文章都会有所收获,下面我们一起来看看吧。一、静态代理静态代理的使用静态代理,代
    2023-07-02

    Java动态代理示例分析

    这篇文章主要讲解了“Java动态代理示例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java动态代理示例分析”吧!定义动态代理指的是,代理类和目标类的关系在程序运行的时候确定的,客户通
    2023-06-29

    详解Java中的静态代理和动态代理

    在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

    Java中引用和动态代理的示例分析

    这篇文章主要介绍了Java中引用和动态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JDK中的引用类型不同引用类型对GC行为的影响引用类型的实现ThreadLo
    2023-05-30

    JDK中动态代理的示例分析

    这篇文章将为大家详细讲解有关JDK中动态代理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。动态代理步骤1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法2.创
    2023-06-15

    Java中反射机制和动态代理的示例分析

    这篇文章主要介绍了Java中反射机制和动态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、反射概述反射机制指的是Java在运行时候有一种自观的能力,能够了解自
    2023-06-15

    java静态代理与动态代理的概念

    本篇内容介绍了“java静态代理与动态代理的概念”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 1.静态代理:编译时生成代理,
    2023-06-02

    怎么理解Java和SAP ABAP的静态代理和动态代理

    本篇内容介绍了“怎么理解Java和SAP ABAP的静态代理和动态代理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下图是某应用里方法的常规
    2023-06-02

    Spring中JDK和cglib动态代理原理的示例分析

    这篇文章给大家分享的是有关Spring中JDK和cglib动态代理原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java代理介绍Java中代理的实现一般分为三种:JDK静态代理、JDK动态代理以及C
    2023-06-02

    Java反射机制中动态代理的示例分析

    这篇文章主要介绍了Java反射机制中动态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 代理模式代理模式就是为其他对象提供一种代理来控制对这个对象的访问。其
    2023-06-17

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录