美文网首页
基于反射的动态代理

基于反射的动态代理

作者: 架构师易哥 | 来源:发表于2019-08-07 21:41 被阅读0次

1 动态代理

动态代理的实现方式常用的有两种:

  • 反射实现:基于反射实现,目标对象必须要有接口。生成的代理类是接口的一个实现类

  • Cglib实现:基于字节码实现,效率稍低,但目标对象不需要有接口。生成的代理类是目标类的子类,因此目标类不能是final的。

2 背景介绍

在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象,只能针对接口做代理。

接口和目标类没有任何变化,只不过为了增加难度,我们增加了返回值。

接口如下,除了增加了方法的返回值外无任何变化:

目标类如下,无任何变化:

2 反射调用方法

接下来,我们使用JDK完成动态代理,对于代理类只需要实现InvocationHandler接口即可,并且要实现其中的invoke()方法。

invoke()中需要传入目标对象、目标对象的方法、调用目标所需的参数,传入后,就会直接调用指定对象的指定方法了。

我们使用举例:

我们只要创建一个ProxyHandler对象,直接调用invoke方法,传入其中所需要的对象、方法、参数,便可以执行我们写好的invoke方法,并且invoke中还可以调用指定对象的指定方法。这种方法非常灵活,ProxyHandler建立后,调用invoke方法时,可以传入任何对象、任何方法,非常自由。

这种操作只是通过反射调用的指定对象的指定方法,并没有使用代理。但是可以用它来实现动态代理。我们只要生成一个代理对象,接口所有的操作都由代理对象来完成。其中,代理对象中再通过这种反射的方式去调用目标对象即可了。

3 动态代理

在使用动态代理时,ProxyHandler需要稍加改造,即在构造方法中传入目标对象。但是这里要注意的是,与静态代理不同,这里的目标对象的类型是任意的,因此同一个ProxyHandler可以用来代理不同的目标对象。

在使用时,如下:

首先,我们定义了被代理的类的实例,并且传给了proxyHandler。然后,我们我们直接调用了Proxy的静态方法newProxyInstance生成了一个接口的实例,这个实例就是代理(而且它知道它代理的是user对象,初始化时已经传给它了)。

然后,直接对这个实例调用方法就可以了,对这个接口调用方法,就相当于执行了invoke中的操作,输出如下:

pre words
hello Lily
post words

注意,在这种实现中,目标类target是在初始化时写死,并且在invoke时直接调用的,如果在invoke中直接调用传来的proxy对象,则会引发循环调用,造成死循环。

我们查看下Proxy类中的静态方法,newProxyInstance方法:

该方法用来返回指定接口的一个代理类实例。

输入参数有:

  • 生成代理类实例的classLoader;

  • 要满足的接口;

  • 代理类的处理器,即具体的实现。

这样就指明了用哪个处理器处理哪个接口中的操作,以及该对象如何生成出来。

生成的对象就是一个代理对象,就可以代理接口的操作了。


欢迎关注我们,不错过每期的原创干货!

相关文章

  • 基于反射的动态代理

    1 动态代理 动态代理的实现方式常用的有两种: 反射实现:基于反射实现,目标对象必须要有接口。生成的代理类是接口的...

  • Proxy - 代理模式

    注意:全文是基于Java来描述和实现的!代理模式的实现有很多种方法:静态代理,动态代理(又分为反射实现的动态代理,...

  • 设计模式之代理模式

    代理分为静态代理和动态代理。 动态代理又包括基于JDK的动态代理、基于CGlib 的动态代理、基于Aspectj实...

  • 类加载和反射

    反射 动态代理

  • 动态代理

    Jdk 动态代理 Jdk动态代理,利用反射,实现 InvocationHandler 接口。Jdk 动态代理需要实...

  • Java动态代理机制分析

    前言 Java动态代理通过反射的机制实现在运行时,基于传入的指定一组接口及委托类对象,动态的产生代理类,代理类负责...

  • 动态代理

    动态代理分为两类:1、基于接口的动态代理; (JDK动态代理 )2、基于类的动态代理;(cglib动态代理)3、J...

  • 第6讲 | 动态代理是基于什么原理?

    谈谈 Java 反射机制,动态代理是基于什么原理? 典型回答 反射机制是 Java 语言提供的一种基础功能,赋予程...

  • 安卓反射和动态代理的应用

    提纲 java反射基础 反射在Android中的应用 Java动态代理 动态代理在Android的应用 java反...

  • Java 代理

    静态代理 动态代理 动态代理, 日志切片使用反射获得方法 动态代理, 自定义注解(对注解的方法,使用动态代理添加切...

网友评论

      本文标题:基于反射的动态代理

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