Java-06:动态代理

6、动态代理

谈及动态代理,难免避不开Java的反射技术。

Java的反射机制:

在程序运行时通过加载已知的class,从而可以操作类或者属性和方法。Java是先编译再运行的语言,Java源文件都是要先经过编译生成class文件,当程序需要动态加载某些类时,它就可以通过反射机制来创建对象并调用方法。

Java 反射api的使用方法在这里不做赘述,不懂的同学可以移驾这里→反射api的使用

说完反射机制,我们来说说动态代理在常用框架Spring中支持模式:JDK Proxy 或者 cglib,不过先来看下动态代理给我们带来了什么?

动态代理:

它是一种代理机制,从静态代理发展到动态代理,代理模式我们可以看成是对调用目标的一种包装,不用直接调用目标方法,通过调用调用代理类的代理方法,来达到对调用目标方法的增强,也可以说这是类似装饰器模式的应用,同时也实现调用者和调用目标之间的解耦。

应用场景:

动态代理是Spring AOP的基础实现,通过动态代理我们可以实现在不同时期调用同一个方法达到不同的目的。例如在日志、事务、用户鉴权、全局异常处理等。

JDK Proxy:

public class PersonHandler implements InvocationHandler {    private PersonDao personDao;    public PersonHandler(PersonDao personDao) {        this.personDao = personDao;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println("先进行热身运动");        Object invoke = method.invoke(personDao, args);        System.out.println("结束进行放松运动");        return invoke;    }}

测试:

    @Test    void test5(){        Person person = new Person();        PersonHandler personHandler = new PersonHandler(person);        PersonDao  personProxy= (PersonDao) Proxy.newProxyInstance(            person.getClass().getClassLoader(),            person.getClass().getInterfaces(),             personHandler        );        personProxy.run();    }

实现对应的InvocationHandler接口,再通过PersonDao为纽带给目标对象建立一个代理对象,应用程序就可以利用这个代理对象间接调用目标对象的方法逻辑,我们再通过在invoke()方法内添加额外的方法,从而可以实现对目标对象方法的增强。

JDK Proxy 是接口为中心的, 相当于添加了一种对于被调用者没有太大意义的限制。如果被调用者没有实现相应的接口,是无法实现JDK Proxy的,这种情况下,我们可以转而使用cglib方式。

cglib:

被代理类:

public class UserService {    public void run(){        System.out.println("我还是在跑步!!!");    }}

接口实现:

public class AutoMethodInterceptor implements MethodInterceptor {    @Override    public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {        System.out.println("先热个身");        Object object = methodProxy.invokeSuper(obj, args);        return object;    }}

测试:

    @Test    void test6(){        Enhancer enhancer = new Enhancer();        enhancer.setSuperclass(UserService.class);        enhancer.setCallback(new AutoMethodInterceptor());        UserService userService = (UserService)enhancer.create();        userService.run();    }

cglib动态代理采取的方式是创建目标类的子类,通过子类可以很容易使用被调用类的方法。

来源:https://www.icode9.com/content-1-826401.html

(0)

相关推荐

  • java设计模式基础--动态代理

    动态代理的意义在于生成一个代理对象,来代理真实对象,从而控制真实对象的访问.比如你是以为软件工程师,客户带着需求去找公司,显然不会直接和你谈,而是去找商务,此时客户认为商务就代表公司.商务(代理对象) ...

  • 代理模式

    为什么要学习代理模式?因为这就是Spring AOP的底层机制![Spring AOP 和 Spring MVC] 1.什么是代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在 ...

  • Java动态代理设计模式

    本文主要介绍Java中两种常见的动态代理方式:JDK原生动态代理和CGLIB动态代理. 什么是代理模式 就是为其他对象提供一种代理以控制对这个对象的访问.代理可以在不改动目标对象的基础上,增加其他额外 ...

  • Java中动态代理使用

    相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象. 代理模式 使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过代理类 ...

  • 一文读懂Java动态代理

    引言 最早的代理模式,我们大致可以联想到三国时期,孟德君挟天子以令诸侯是代理模式,是权利代理:现今生活中类似房产中介.票务中介是代理模式,是业务代理:还有翻墙浏览网页是代理模式,是VPN代理:回到我们 ...

  • Android插件化开发基础之Java动态代理(proxy)机制的简单例子

    一.代码 package com.sangfor.tree; import java.lang.reflect.InvocationHandler; import java.lang.reflect. ...

  • Java之jdk和CGLib实现动态代理

    Java之jdk和CGLib实现动态代理

  • .NET 下基于动态代理的 AOP 框架实现揭秘

    Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 https://www.cnblogs.com/weihanli/p/roslyn-based-conditi ...

  • 对JDK动态代理的模拟实现

    动态代理在JDK中的实现: IProducer proxyProduec = (IProducer)Proxy.newProxyInstance(producer.getClass().getClas ...

  • 动态代理

    一.动态代理浅析 何为代理?就是暂时代人担任 某单位的负责职务.比如代课,火车票代售点. 代理模式:为其他对象提供一种代理以控制这个对象的访问.下面为代理模式的类图 如何实现代理 通过 组合 来实现: ...

  • jdk动态代理

    JDK动态代理和CGLIB代理的区别: JDK动态代理:其代理对象必须是某个接口的实现,他是通过在运行期间创建一个接口的实现类来完成对目标对象的代理. CGLIB代理:实现原理类似于JDK动态代理,只 ...