Java中JDK动态代理的超详细讲解
目录
- 1. 什么是动态代理?
- 2.动态代理的实现方式有几种?
- 3. JDK动态代理
- 4. CGLB动态代理
- 5.动态代理的效率
- 6.为什么要使用动态代理呢?
- 7. JDK动态代理详细使用介绍
- 总结
1. 什么是动态代理?
动态代理是通过创建代理对象,在不改变原有代码的基础上,给程序增加新的功能,实现了程序的功能增强。
2.动态代理的实现方式有几种?
- JDK动态代理
- CGLB动态代理
3. JDK动态代理
使用了JDK中的InvocationHandler接口,Method类和Proxy类。JDK的动态代理的要求:目标类必须要有接口。(目标类就是那个我们需要增强功能的方法所在的那个类,也是接口实现类所在的类)。我们通常回给目标类中要增强的方法增加上日志,事务等非业务功能。
4. CGLB动态代理
CGLB动态代理即Code Generation Library,是一个开源的第三方工具库,其原理是继承,去生成目标类的子类对象,这样对子类的功能进行增强。但是要求:目标类不能用final修饰,目标类中的方法也不能被final修饰。
5.动态代理的效率
CGLB动态代理的效率要大于JDK动态代理的效率。
6.为什么要使用动态代理呢?
设计出来动态代理是为了解决一定的需求,因为在我们实际的开发过程中,经常会遇到,要给写好的某个方法的前面或者是后面增加方法,甚至是给好几个类的方法增加新的功能。若是我们直接在方法上写上新的增加的方法,就会显得很乱,而且很冗余。
那么我们初步改进可以通过写一个工具类去解决,在一个工具类中写上我们要增强的方法,但是要求这些增强的方法是静态修饰的,这样我们就可以在原有的代码上,使用类名.方法名的方式,来给原有的功能增加新的功能。这样一定程度上的解决了代码混乱的程度,但是还是不太完美。
再次改进:这个时候就是使用动态代理。
这就体现了动态代理的优势,即在不修改任何原有代码的情况下,实现给原有功能的增强。
7. JDK动态代理详细使用介绍
由于我们在Java项目中,直接使用动态代理的地方不多,所以我们都是使用的aspectj框架中写好的动态代理。aspectj框架中的动态代理就是封装的JDK动态代理。
下面将仔细介绍使用JDK动态代理的步骤:
- 最好可以先创建一个工具类,将要增强的功能先写好,这样我们便可以一句代码能调动这个用来增强的功能。
- 自定义类,去实现InvocationHandler接口,并且,重写invoke()方法。
- 在这个自定义的类中,添加Objeck属性,并且写上有参的构造方法。
- 在invoke()方法中写上如下代码
然后去主类中,使用动态代理,实现功能的增强。
注意:
上面的JDK动态代理的原理是反射机制。
我们可以使用proxy.getClass().getName()看到的值为com.sun.proxy.$Proxy
总结
到此这篇关于Java中JDK动态代理的文章就介绍到这了,更多相关Java JDK动态代理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
java动态代理(jdk与cglib)详细解析
JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经
-
详解Java JDK动态代理
今天来看看Java的另一种代理方式--JDK动态代理 我们之前所介绍的代理方式叫静态代理,也就是静态的生成代理对象,而动态代理则是在运行时创建代理对象.动态代理有更强大的拦截请求功能,因为可以获得类的运行时信息,可以根据运行时信息来获得更为强大的执(骚)行(操)力(作). 我们还是以上一个例子为例,这里的IStars接口和Stars类都不需要修改,只需要修改代理类. 创建JDK动态代理需要先实现InvocationHandler接口,并重写其中的invoke方法,具体步骤如下: 1. 创建一个类
-
Java JDK 动态代理的使用方法示例
本文主要和大家分享介绍了关于Java JDK 动态代理使用的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 前言 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. Spring AOP的实现对于接口来说就是使用的JDK的动态代理来实现的,而对于类的代理使用CGLIB来实现. JDK的动态代理,就是在程序运行的过程中,根据被代理的接口来动态生成代理类的class文
-
java代理 jdk动态代理应用案列
java代理有jdk动态代理.cglib代理,这里只说下jdk动态代理,jdk动态代理主要使用的是java反射机制(既java.lang.reflect包) 原理是(歌手.经纪人做例子): 建立一个公共的接口,比如:歌手public interface Singer: 用具体的类实现接口,比如:周杰伦,他是歌手所以实现Singer这个类,class MySinger implements Singer 建立代理类,这里也就是经纪人,他需要实现InvocationHandler类,并重写invok
-
深入理解java动态代理的两种实现方式(JDK/Cglib)
什么是代理模式? 代理模式:在调用处不直接调用目标类进行操作,而是调用代理类,然后通过代理类来调用目标类进行操作.在代理类调用目标类的前后可以添加一些预处理和后处理操作来完成一些不属于目标类的功能. 为什么要使用代理模式? 通过代理模式可以实现对目标类调用的控制.在目标类调用前/后进行一些不属于目标类的操作,如:数据验证.预处理.后处理.异常处理等 什么是静态代理什么是动态代理? 静态代理:代理类只能实现对"特定接口的实现类"进行代理 动态代理:代理类可以实现对多种类的代理 jdk代理
-
java jdk动态代理详解
jdk动态代理要对一个类进行代理,被代理的类必须实现至少一个接口,并且只有接口中的方法才能被代理. jdk实现动态代理一般分为三步: 1. 编写接口和实现类. 2. 写一个处理器,该处理器实现InvocationHandler接口,该接口只有一个方法,其签名为public Object invoke(Object proxy, Method method, Object[] args)throws Throwable;可在该处理器的实现方法中,在方法调用前和调用后加入自己的代码,从而进行动态拦截
-
Java JDK动态代理(AOP)的实现原理与使用详析
本文主要给大家介绍了关于Java JDK动态代理(AOP)实现原理与使用的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 一.什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 代理模式UML图: 简单结构示意图: 为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别.通过代理类这中间一层,能有效控制对委托类对
-
Java JDK动态代理的基本原理详细介绍
JDK动态代理详解 本文主要介绍JDK动态代理的基本原理,让大家更深刻的理解JDK Proxy,知其然知其所以然.明白JDK动态代理真正的原理及其生成的过程,我们以后写JDK Proxy可以不用去查demo,就可以徒手写个完美的Proxy.下面首先来个简单的Demo,后续的分析过程都依赖这个Demo去介绍,例子采用JDK1.8运行. JDK Proxy HelloWorld package com.yao.proxy; /** * Created by robin */ public inter
-
Java JDK动态代理实现原理实例解析
JDK动态代理实现原理 动态代理机制 通过实现 InvocationHandler 接口创建自己的调用处理器 通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类 通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入 Interface InvocationHandler 该接口中仅定义了一个方法Object:invoke(Object obj,Method m
-
Java中JDK动态代理的超详细讲解
目录 1. 什么是动态代理? 2.动态代理的实现方式有几种? 3. JDK动态代理 4. CGLB动态代理 5.动态代理的效率 6.为什么要使用动态代理呢? 7. JDK动态代理详细使用介绍 总结 1. 什么是动态代理? 动态代理是通过创建代理对象,在不改变原有代码的基础上,给程序增加新的功能,实现了程序的功能增强. 2.动态代理的实现方式有几种? JDK动态代理 CGLB动态代理 3. JDK动态代理 使用了JDK中的InvocationHandler接口,Method类和Proxy类.JDK
-
Java中线程上下文类加载器超详细讲解使用
目录 一.什么是线程上下文类加载器 1.1.重要性 1.2.使用场景 二.ServiceLoader简单介绍 三.案例 3.1.使用ServiceLoader加载mysql驱动 3.2.Class.forName加载Mysql驱动 3.2.1.com.mysql.jdbc.Driver 3.2.2.java.sql.DriverManager初始化 3.2.3.调用DriverManager的registerDriver方法 3.2.4.执行DriverManager.getConnection
-
深度剖析java中JDK动态代理机制
摘要 相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象. 代理模式 使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过代理类来调用目标方法,代理类会将所有的方法调用分派到目标对象上反射执行,还可以在分派过程中添加"前置通知"和后置处理(如在调用目标方法前校验权限,在调用完目标方法后打印日志等)等功能. 使用动态代理的五大步骤 1.通过实现InvocationHandler接口来自定义自己的Invocati
-
浅析Java中的动态代理
目录 代理常见功能 代理模式的组成 代理模式分类 动态代理实现的技术 JDK 代理的实现步骤 CGLIB 代理实现步骤 代理常见功能 日志代理 数据库访问的事务代理 代理模式的组成 抽象主题:通过接口或抽象类定义核心业务方法. 真实主题:实现了接口的实现类,是实施代理的具体对象.即代理最终代理的是具体的实现类类而不是接口. 代理:具有与代理对象相同的方法,可以控制和扩展被代理对象的功能,也是使用代理对象的根据目的. 代理对象 = 增强代码 + 目标对象(原对象) 代理模式分类 静态代理:代理类与
-
Java实现JDK动态代理的原理详解
目录 概念 案例 静态代理 JDK动态代理模式 原理分析 真相大白 概念 代理:为控制A对象,而创建出新B对象,由B对象代替执行A对象所有操作,称之为代理.一个代理体系建立涉及到3个参与角色:真实对象(A),代理对象(B),客户端. 其中的代理对象(B)起到中介作用,连通真实对象(A)与客户端,如果进一步拓展,代理对象可以实现更加复杂逻辑,比如对真实对象进行访问控制. 案例 需求:员工业务层接口调用save需要admin权限,调用list不需要权限,没权限调用时抛出异常提示. 静态代理 /**
-
Java中反射动态代理接口的详解及实例
Java语言中反射动态代理接口的解释与演示 Java在JDK1.3的时候引入了动态代理机制.可以运用在框架编程与平台编程时候捕获事件.审核数据.日志等功能实现,首先看一下设计模式的UML图解: 当你调用一个接口API时候,实际实现类继承该接口,调用时候经过proxy实现. 在Java中动态代理实现的两个关键接口类与class类分别如下: java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 我们下面就通过InvocationHan
-
十分钟理解Java中的动态代理
若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. 一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家"委托"代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道背后的厂家究竟是谁,也就是说,"委托者"对我们来说是不可见的;其次,微商代理主要以朋友圈的人为目标客户,这就
-
java 中动态代理机制的实例讲解
java 中动态代理机制的实例讲解 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾. 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)
-
JDK动态代理之WeakCache缓存的实现机制
上一篇我们分析了Proxy类的内部是怎样产生代理类的,我们看到了Proxy内部用到了缓存机制,如果根据提供的类加载器和接口数组能在缓存中找到代理类就直接返回该代理类,否则会调用ProxyClassFactory工厂去生成代理类.这里用到的缓存是二级缓存,它的一级缓存key是根据类加载器生成的,二级缓存key是根据接口数组生成的.具体的内部机制我们直接贴上代码详细解释. //Reference引用队列 private final ReferenceQueue<K> refQueue = new
随机推荐
- 基于ES6作用域和解构赋值详解
- python中管道用法入门实例
- python远程登录代码
- 修改Oracle监听默认端口号1521的方法
- jQuery事件绑定与解除绑定实现方法
- python使用paramiko模块实现ssh远程登陆上传文件并执行
- Javascript中valueOf与toString区别浅析
- Python socket.error: [Errno 98] Address already in use的原因和解决方法
- Flask SQLAlchemy一对一,一对多的使用方法实践
- 解析mysql不重复字段值求和
- Android实现本地上传图片并设置为圆形头像
- C++常见错误中英文对照表
- SQL Server中删除重复数据的几个方法
- jquery实现标题字体变换的滑动门菜单效果
- JavaScript高级程序设计
- 总结JavaScript三种数据存储方式之间的区别
- JS实现兼容性好,带缓冲的动感网页右键菜单效果
- JavaScript实现点击文本自动定位到下拉框选中操作
- Serv-U 无法连接到服务器127.0.0.1,端口43958 之解决办法
- java支付宝即时到帐提交订单功能