美文网首页
手写一个动态代理框架

手写一个动态代理框架

作者: __晨风__ | 来源:发表于2020-06-07 11:48 被阅读0次

手写一个动态代理框架

一:代理认知

1、在JAVA里什么是动态代理?

个人理解:这里的动态代理首先要明确代理的对象是什么,当然是代理类。

2、代理类能干什么?

首先类具有什么,无非就是属性和方法,代理属性没多大意义,所以必然是代理类方法。

3、为什么需要代理方法,直接调用不更好么?

当然不是,通常我们想去调用目标类A的方法method(),我们并非是直接调用,而是需要添加一些逻辑,同时又去调用A.method()。

4、直接在A方法里改不行么?

肯定不行,如果A.method()方法此时已经被许多地方调用,直接修改method(),势必会带来不可控的风险。所以我们对A.method()进行封装,这里我们常用的技术手段有:装饰器模式、代理模式等

二、在java中代理类的方式有哪些:静态代理(staticProxy)、动态代理(dynamicProxy)

2.1:动态代理又有:jdk里的Proxy.newProxyInstance,通过method.invoke来去调用真正的A.method().

2.2: 其次动态代理的另外一种实现方式:cglib,其中cglib提供了Enhancer和MethodProxy.invokeSuper来实现

         这里需要说明的是:cglib并非是jdk提供的

三、静态代理

图1-晨风

         3.1静态代理实现方式一:继承目标类

图2-晨风

         3.2静态代理实现方式二:通过实现目标接口

图3-晨风

四、动态代理

图4-晨风

         4.1jdk的动态代理实现

图5-晨风

         4.2cglib的动态代理实现

          4.2.1依赖cglib包

图6-晨风

         4.2.2

图7-晨风

五、手动实现动态代理

         这里我们实现的思路如下:

         5.1先去写一个java 文件的字符串

         5.2然后通过代码生成指定路径下的.java文件

         5.3通过jdk为我们提供的JavaComplier来生成.class文件

         5.4再通过ClassLoader将.class文件加载到jvm当中,并返回一个class对象

         5.5最后通过反射class对象生成我们的代理类的实例对象

这里实现了一个自定义的ClassLoader

         核心代码如下:

图8-晨风

六、总结

         说了这么多,代理到底能干什么?

         说白了其实就是对目标方法进行增强,满足新的业务需要。

         为什么动态代理又独受恩宠,因为静态代理会让我们的代码冗余非常多,如果我们需要对上千个接口进行增强,那么代理类的数量和目标类的比例为1:1.所以才出现了动态代理,在这里动态代理会为我们省去大量的冗余代码

相关文章

  • 手写一个动态代理框架

    手写一个动态代理框架 一:代理认知 1、在JAVA里什么是动态代理? 个人理解:这里的动态代理首先要明确代理的对象...

  • Java高级主题(五)——动态代理

    代理可以分为静态代理、动态代理,动态代理又可以分为 jvm的动态代理 和 cglib的动态代理。像spring框架...

  • 图灵学院Java架构师-VIP-手写MyBatis框架

    最近复习了Mybatis,就想用自己的理解手写mybatis框架,Mybatis源码的核心是jdk动态代理和jdb...

  • 代理模式

    代理模式的作用:AOP、拦截器、解耦 ... 1. 静态代理: 2. 动态代理: 3. 自己手写动态代理: 结构结...

  • 实现一个简单的基于动态代理的 AOP

    实现一个简单的基于动态代理的 AOP Intro 上次看基于动态代理的 AOP 框架实现,立了一个 Flag, 自...

  • java动态代理

    原文地址:java动态代理 代理 最近在学习 Spring 框架,AOP涉及到动态代理的知识,故整理一下,了解动态...

  • 手写一个面向接口的动态代理

    如题,手写一个面向接口的动态代理。我们需要先了解jdk中的动态代理是怎么实现的。 理解生成的代码和调用过程 设置v...

  • 设计模式之动态代理

    动态代理模式,在当前流行框架(如:Spring、Mybatis、Dubbo)中应用非常广泛,掌握动态代理模式是理...

  • 2018-03-21

    与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码...

  • Java常见几种动态代理实现方式

    一、四种方式 JDK动态代理:运行期动态的创建代理类,只支持接口。 ASM:一个 Java 字节码操控框架。它能够...

网友评论

      本文标题:手写一个动态代理框架

      本文链接:https://www.haomeiwen.com/subject/kixctktx.html