动态代理详解

简介: 动态代理详解   动态代理它可以直接给某一个目标对象生成一个代理对象,而不需要代理类存在。    动态代理与代理模式原理是一样的,只是它没有具体的代理类,直接通过反射生成了一个代理对象。    动态代理生成技术:        1. 基于jdk提供一个Proxy类,可以直接给实现某接口的实现类直接生成代理对象。

动态代理详解

   动态代理它可以直接给某一个目标对象生成一个代理对象,而不需要代理类存在。
    动态代理与代理模式原理是一样的,只是它没有具体的代理类,直接通过反射生成了一个代理对象。
    动态代理生成技术:
        1. 基于jdk提供一个Proxy类,可以直接给实现某接口的实现类直接生成代理对象。
        2. 基于cglib (spring框架会学习)

    java.lang.reflect.Proxy;   该类可以直接生成一个代理对象。

    Proxy类的方法
        public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 返回一个指定接口的代理类实例。
            仅能代理实现至少一个接口的类(即目标对象需要至少有一个接口)。
            ClassLoader:类加载器。固定写法,和被代理类使用相同的类加载器即可。
            Class[]:代理类要实现的接口。固定写法,和被代理类使用相同的接口即可。
            InvocationHandler:策略(方案)设计模式的应用。如何去具体实现代理,由我们自己决定。

    InvocationHandler接口中的invoke方法:调用代理类的任何方法,此方法都会执行。
        Object invoke(Object proxy, Method method, Object[] args)
            Object proxy:代理对象本身的引用。一般用不着。
            Method method:当前调用的方法。
            Object[] args:当前方法用到的参数。

    动态代理的应用
        在动态代理技术里,由于不管用户调用代理对象的什么方法,都是调用开发人员编写的处理器的invoke方法(这相当于invoke方法拦截到了被代理对象的方法调用)。
        并且,开发人员通过invoke方法的参数,还可以在拦截的同时,知道用户调用的是什么方法,因此利用这两个特性,就可以实现一些特殊需求,

        例如:拦截用户的访问请求,以检查用户是否有访问权限动态地为目的对象添加额外的功能

    静态/动态代理图解:

我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
消息中间件 缓存 NoSQL
热点账户高并发记账方案
热点账户高并发记账方案
1752 0
热点账户高并发记账方案
|
存储 SQL 微服务
常用的分布式事务解决方案(三)
常用的分布式事务解决方案(三)
|
算法 Java 大数据
Java多线程中顺序打印
Java多线程中顺序打印
282 2
Java多线程中顺序打印
|
存储 安全 Java
20个SpringSecurity框架核心组件源码详解
以上是 V 哥给大家整理的20个Spring Security 中核心组件的分析与运行过程,理解后可助你玩转Spring Security,如果文章对你有帮助,客官请点赞收藏转发给更多需要的兄弟,任何疑问请评论区与V哥交流。
187 0
|
负载均衡 算法 Java
【面试宝藏】Go语言运行时机制面试题
探索Go语言运行时,了解goroutine的轻量级并发及GMP模型,包括G(协程)、M(线程)和P(处理器)。GMP调度涉及Work Stealing和Hand Off机制,实现负载均衡。文章还讨论了从协作到基于信号的抢占式调度,以及GC的三色标记算法和写屏障技术。理解这些概念有助于优化Go程序性能。
171 4
|
Java Go
Golang深入浅出之-Go语言指针面试必知:理解与使用指针
【4月更文挑战第21天】Go语言中的指针允许直接操作内存,常用于高效数据共享和传递。本文介绍了指针的基础知识,如声明、初始化和解引用,以及作为函数参数使用。此外,讨论了`new()`与`make()`的区别和内存逃逸分析。在结构体上下文中,指针用于减少复制开销和直接修改对象。理解指针与内存管理、结构体的关系及常见易错点,对于面试和编写高性能Go代码至关重要。
360 2
|
消息中间件 存储 中间件
吐血总结——消息队列之RocketMQ知识梳理
消息队列主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。 目前在生产环境,使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。今天我就首先分析一下RocketMQ,目前公司用的也是这个,因此在进行一下梳理,加深一下印象。
530 0
|
JSON Shell Linux
Shell获得Curl命令返回的json值
使用curl命令,获取solr中query的结果笔数 Linux中Shell获得json中的值
349 0
|
算法
揭秘Top-K问题:算法探索、性能优化与应用场景深度解析
揭秘Top-K问题:算法探索、性能优化与应用场景深度解析
812 0