Java之JDK和CGlib实现动态代理-yellowcong
来源:互联网 发布:锐度旗舰店淘宝 编辑:程序博客网 时间:2024/05/29 12:23
在Java中,对于动态代理,在框架中用到很多,我们可以通过JDK提供的InvocationHandler类实现动态代理,这个方法的缺点是,必须要有接口和实现类,然而Cglib这个工具类,解决了这个问题,可以直接通过类来进行动态代理的操作。Cglib是基于asm的,反射类的生成比较慢,但是方法执行速度块,javaassist可以用来修改字节码,也可以实现aop的操作
jdk动态代理是由Java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。还有一点必须注意:jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,jdk动态代理不能应用。
ASM 是一个 Java 字节码操控框架。它能够以二进制形式修改已有类或者动态生成类。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。
不过ASM在创建class字节码的过程中,操纵的级别是底层JVM的汇编指令级别,这要求ASM使用者要对class组织结构和JVM汇编指令有一定的了解。
通过javaのJDK来实现
通过继承Java的InvocationHandler类,这种方法需要有接口类,才可以实现
接口类
interface BookServie{ /** * 添加图书的操作 * @return */ String add(String name);}
实现类
class BookServieImpl implements BookServie{ @Override public String add(String name) { System.out.println("Book Add Method"); return "添加书籍"+name; }}
代理类
需要复写 invoke 的方法,可以在这个地方来做一些方法调用的前后处理事情,同时还需要写一个getProxy方法来绑定我们的BookProxy 和BookServie 这两个类.
/** * 使用java本生的代理对象需要用到,接口类,实现类 * @author yellowcong * @data 2017/08/31 */class BookProxy implements InvocationHandler{ private Object target ; public BookProxy(Object target) { super(); this.target = target; } /** * 将Object绑定到当前的对象上 * @param target * @return */ public Object getProxy() { //初始化代理对象 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; try { System.out.println("proxy before"); result = method.invoke(this.target, args); System.out.println("proxy end"); }finally { } return result; }}
测试
/****作者:yellowcong*日期:2017/08/30*時間:17:08:21*描述:*/public class Demo4 { public static void main(String[] args) throws Exception { BookProxy proxy = new BookProxy(new BookServieImpl()); BookServie book = (BookServie) proxy.getProxy(); String result = book.add("Think in Java"); System.out.println(result); }}
Cglib实现代理
对于上面说到JDK仅支持对实现接口的委托类进行代理的缺陷,这个问题CGLIB给予了很好的补位,解决了这个问题,使其委托类也可是非接口实现类。需要导入的依赖
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2</version></dependency>
net.sf.cglib.proxy.Enhancer – 主要的增强类
net.sf.cglib.proxy.MethodInterceptor – 主要的方法拦截类,它是Callback接口的子接口,需要用户实现
net.sf.cglib.proxy.MethodProxy – JDK的java.lang.reflect.Method类的代理类,可以方便的实现对源对象方法的调用,如使用:
实体类
class BookServieDemo{ public String add(String name) { System.out.println("Book Add Method"); return "添加书籍"+name; }}
代理类
class BookDemoProxy implements MethodInterceptor{ private Object target ; /** * 代理对象实例化的时候,就绑定代理 * @param target */ public BookDemoProxy(Object target ) { this.target = target ; } /** * 获取代理对象 * @return */ public Object getProxy() { return Enhancer.create(this.target.getClass(), this); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { Object ret = null; System.out.println("proxy before"); ret = method.invoke(this.target, args); System.out.println("proxy end"); return ret; }}
测试类
/****作者:yellowcong*日期:2017/08/31*時間:9:57:55*描述:*/public class Demo5 { public static void main(String[] args) { BookDemoProxy proxy = new BookDemoProxy(new BookServieDemo()); BookServieDemo service = (BookServieDemo) proxy.getProxy(); String str = service.add("Think in AOP"); System.out.println(str); }}
- Java之JDK和CGlib实现动态代理-yellowcong
- 大话java之JDK动态代理和CGLIB动态代理
- Java学习之java动态代理(JDK和cglib)
- Java的动态代理实现(JDK默认和CGLIB)
- Java动态代理之JDK实现和CGlib实现(简单易懂)火推笔记
- Java动态代理的之JDK和CGLIB
- 使用JDK和CGLIB实现动态代理
- 动态代理-JDK和Cglib实现
- 使用jdk和cglib实现动态代理
- Java动态代理之JDK动态代理和CGLib动态代理
- Java动态代理之JDK动态代理和CGLib动态代理 面向切面编程AOP原理
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- idea启动异常问题
- redis的详细理解和运用_入门
- Table
- 【二分-kMeans算法】二分K均值聚类分析与Python代码实现
- 解析获取的Json数据
- Java之JDK和CGlib实现动态代理-yellowcong
- CentOS7 64位下MySQL5.7安装与配置(YUM)
- PangRank算法到TextRank
- Semaphore
- Objective-C编码规范:26个方面解决iOS开发问题
- 【kubernetes/k8s源码分析】kube-controller-manager 启动流程分析
- hylan:解决connect / as sysoper 登陆权限不足问题
- web前端学习日记33
- MFC使用ADO连接SQLServer数据库