广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java jdk动态代理详解
  • 526
分享到

java jdk动态代理详解

javajdk动态代理 2022-11-15 22:11:23 526人浏览 泡泡鱼

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

摘要

jdk动态代理要对一个类进行代理,被代理的类必须实现至少一个接口,并且只有接口中的方法才能被代理。 jdk实现动态代理一般分为三步: 1. 编写接口和实现类。 2. 写一个处理器,该

jdk动态代理要对一个类进行代理,被代理的类必须实现至少一个接口,并且只有接口中的方法才能被代理。

jdk实现动态代理一般分为三步:

1. 编写接口和实现类。

2. 写一个处理器,该处理器实现InvocationHandler接口,该接口只有一个方法,其签名为public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;可在该处理器的实现方法中,在方法调用前和调用后加入自己的代码,从而进行动态拦截。要注意的是proxy为生成的动态代理类,并不是真的我们被代理的类,所以可在处理器中加入Object类型的成员变量,指向我们真正要求被代理的类(即第1步中的实现类)。

3. 使用java.lang.reflect.Proxy类的newProxyInstance方法生成动态代理类。对所有要代理方法的调用,都是直接调用生成的动态代理类的方法即可,但是要先对它进行强制类型转换,转换成我们要调用的方法的接口。

JDK原理分析:
通过分析Proxy的源代码,可看到动态代理类的详细生成。newProxyInstance方法首先生成动态代理类的Class实例,再调用它的参数类型为InvocationHandler的构造函数来生成动态代理类并返回。

动态代理类的Class实例是怎么生成的呢,是通过ProxyGenerator类来生成动态代理类的class字节流,把它载入方法区。

分析class字节流生成的过程可以看到它使用Proxy为它的父类,实现所有要代理的接口的方法,每个方法的实现体里主要都是调用处理器的invoke方法。

class字节流的生成过程的主要代码如下:


private byte[] generateClassFile()
    {
        addProxyMethod(hashCodeMethod, java/lang/Object);
        addProxyMethod(equalsMethod, java/lang/Object);
        addProxyMethod(toStringMethod, java/lang/Object);
        for(int i = 0; i < interfaces.length; i++)
        {
            Method amethod[] = interfaces[i].getMethods();
            for(int k = 0; k < amethod.length; k++)
                addProxyMethod(amethod[k], interfaces[i]);

        }

        List list;
        for(Iterator iterator = proxyMethods.values().iterator(); iterator.hasNext(); checkReturnTypes(list))
            list = (List)iterator.next();

        try
        {
            methods.add(generateConstructor());
            for(Iterator iterator1 = proxyMethods.values().iterator(); iterator1.hasNext();)
            {
                List list1 = (List)iterator1.next();
                Iterator iterator2 = list1.iterator();
                while(iterator2.hasNext())
                {
                    ProxyMethod proxymethod = (ProxyMethod)iterator2.next();
                    fields.add(new FieldInfo(proxymethod.methodFieldName, "Ljava/lang/reflect/Method;", 10));
                    methods.add(<SPAN style="COLOR: red">proxymethod.generateMethod()</SPAN><SPAN style="COLOR: #000000">);</SPAN>       



        } 
    } 

    methods.add(generateStaticInitializer()); 

catch(IOException ioexception) 

    throw new InternalError("unexpected I/O Exception"); 

if(methods.size() > 65535) 
    throw new IllegalArgumentException("method limit exceeded"); 
if(fields.size() > 65535) 
    throw new IllegalArgumentException("field limit exceeded"); 
cp.getClass(dotToSlash(className)); 
cp.getClass("java/lang/reflect/Proxy"); 
for(int j = 0; j < interfaces.length; j++) 
    cp.getClass(dotToSlash(interfaces[j].getName())); 

cp.setReadOnly(); 
ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(); 
DataOutputStream dataoutputstream = new DataOutputStream(bytearrayoutputstream); 
try 

    dataoutputstream.writeInt(-889275714); 
    dataoutputstream.writeShort(0); 
    dataoutputstream.writeShort(49); 
    cp.write(dataoutputstream); 
    dataoutputstream.writeShort(49); 
    dataoutputstream.writeShort(cp.getClass(dotToSlash(className))); 
    dataoutputstream.writeShort(cp.getClass("java/lang/reflect/Proxy")); 
    dataoutputstream.writeShort(interfaces.length); 
    for(int l = 0; l < interfaces.length; l++) 
        dataoutputstream.writeShort(cp.getClass(dotToSlash(interfaces[l].getName()))); 

    dataoutputstream.writeShort(fields.size()); 
    FieldInfo fieldinfo; 


//添加属性
for(Iterator iterator3 = fields.iterator(); iterator3.hasNext(); fieldinfo.write(dataoutputstream))

fieldinfo = (FieldInfo)iterator3.next();
            //添加方法
            dataoutputstream.writeShort(methods.size());
            MethodInfo methodinfo;
            for(Iterator iterator4 = methods.iterator(); iterator4.hasNext(); methodinfo.write(dataoutputstream))
                methodinfo = (MethodInfo)iterator4.next();

            dataoutputstream.writeShort(0);
        }
        catch(IOException ioexception1)
        {
            throw new InternalError("unexpected I/O Exception");
        }
        return bytearrayoutputstream.toByteArray();
    }


注:代码中加红部分proxymethod.generateMethod()为每个方法生成方法体,通过查看源码可以看出都是在调用InvocationHandler接口的实现处理器的invoke方法。

--结束END--

本文标题: java jdk动态代理详解

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

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

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

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

下载Word文档
猜你喜欢
  • java jdk动态代理详解
    jdk动态代理要对一个类进行代理,被代理的类必须实现至少一个接口,并且只有接口中的方法才能被代理。 jdk实现动态代理一般分为三步: 1. 编写接口和实现类。 2. 写一个处理器,该...
    99+
    2022-11-15
    java jdk 动态代理
  • jdk动态代理和cglib动态代理详解
    目录静态代理基于继承的方式实现静态代理基于聚合的方式实现静态代理继承与聚合方式实现的静态代理对比动态代理JDK动态代理如何实现一个HashMap的动态代理类?Cglib动态代理JDK...
    99+
    2022-11-12
  • java动态代理(jdk与cglib)详细解析
    JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息...
    99+
    2022-11-15
    java jdk cglib
  • Java反射(JDK)与动态代理(CGLIB)详解
    目录一、反射二、动态代理1、JDK代理2、CGLIB代理3、JDK代理与CGLIB代理对比总结一、反射 概念:在运行状态中,对于任意的一个类,都能够知道这个类的所有字段和方法,对任意...
    99+
    2022-11-12
  • Java实现JDK动态代理的原理详解
    目录概念案例静态代理JDK动态代理模式原理分析真相大白概念 代理:为控制A对象,而创建出新B对象,由B对象代替执行A对象所有操作,称之为代理。一个代理体系建立涉及到3个参与角色:真实...
    99+
    2022-11-13
  • Java——JDK动态代理
    1.动态代理 1.1什么是动态代理? 动态代理(理解) 基于反射机制 举个例子,生活中一般在打官司的时候都会请代理律师,为什么要请律师呢?是因为开庭的时候大部人对于打官司没有经验,只会说出自己案件的陈述,并不会根据法律等争取自己权益...
    99+
    2023-08-31
    java 开发语言
  • Java中JDK动态代理的超详细讲解
    目录1. 什么是动态代理?2.动态代理的实现方式有几种?3. JDK动态代理4. CGLB动态代理5.动态代理的效率6.为什么要使用动态代理呢?7. JDK动态代理详细使用介绍总结1...
    99+
    2022-11-13
    Java jdk动态代理 java动态代理原理 jdk动态代理是如何实现的
  • jdk动态代理使用实例详解
    目录前言为什么需要代理java中常用的代理模式一、JDK 动态代理二、cglib静态代理三、spring中代理的使用总结前言 代理模式不管是JDK,spring框架,还是日常的开发中...
    99+
    2022-11-13
  • JAVA代理,静态,动态详解
    目录代理静态代理动态代理JDK动态代理CGLib动态代理总结代理 为其他对象提供一种代理以控制这个对象的访问,在某些情况下一个对象不能直接访问那个对象时,代理就起到了客户端和被代理对...
    99+
    2022-11-12
  • JDK动态代理步骤详解(源码分析)
    动态代理步骤 1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法 2.创建被代理的类以及接口 3.通过Proxy的静态方法 通过Proxy的静态方...
    99+
    2022-11-12
  • Java如何实现JDK动态代理
    这篇文章主要讲解了“Java如何实现JDK动态代理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java如何实现JDK动态代理”吧!概念代理:为控制A对象,而创建出新B对象,由B对象代替执行...
    99+
    2023-07-02
  • JAVA的动态代理详解
    文章目录 前言一、动态是什么?二、使用步骤1.导入相应的包2.定义接口3.定义接口实现类4.实现InvocationHandler接口5.实现代理 三、整体实例四、输出结果总结 前言...
    99+
    2023-08-31
    java 开发语言
  • Java的动态代理和静态代理详解
    目录0、代理模式1、静态代理2、 加深理解3、动态代理动态代理的例子总结0、代理模式 为什么要学习代理模式?这是SpringAOP的底层【SpringAOP和SpringMVC】 代...
    99+
    2022-11-13
  • 基于JDK动态代理原理解析
    目录1、回顾一下JDK动态代理的核心参数2、实现一个简单的动态代理①、定义接口Subject②、定义接口的实现类RealSubject③、定义代理对象创建工厂④、创建测试类,为tar...
    99+
    2023-05-18
    JDK动态代理原理 JDK动态代理 动态代理原理
  • JDK动态代理过程原理及手写实现详解
    目录JDK动态代理的过程手写实现JDK动态代理创建MyInvocationHandler接口创建MyClassLoader类加载器创建代理类使用自定义动态代理类创建接口创建被代理接口...
    99+
    2022-11-13
  • Java静态代理与动态代理案例详解
    代理模式 代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象...
    99+
    2022-11-12
  • 详解java 中的动态代理
    这期内容当中小编将会给大家带来有关详解java 中的动态代理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java动态代理相关先来看静态代理模式代码:package test; public inter...
    99+
    2023-05-31
    java 动态代理 ava
  • 通俗易懂 快速理解 JDK动态代理 和 cglib动态代理
    动态代理的实现方案有两种,JDK动态代理和CGLIB动态代理,区别在于JDK自带的动态代理,必须要有接口,而CGLIB动态代理有没有接口都可以。 JDK动态代理:JDK原生的实现方式,需要被代理的...
    99+
    2023-10-21
    java spring
  • java中JDK动态代理的原理是什么
    这篇文章将为大家详细讲解有关java中JDK动态代理的原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java可以用来干什么Java主要应用于:1. web开发;2. Android...
    99+
    2023-06-14
  • spring cglib 与 jdk 动态代理
    1. 概述JDK动态代理是利用java反射机制 生成一个实现接口的匿名类, 在调用具体方法前调用InvocationHandler来处理Cglib动态代理是 利用asm开源包 把被代理类的class文件加载进来 通过修改其字节码生成子类来处...
    99+
    2023-05-31
    spring cglib jdk
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作