上一篇博客说了实现InvocationHandler接口的jdk动态代理,还有一种实现动态代理的方式则是:通过继承的方式实现的cglib动态代理。

先在程序中导入cglib的包,cglib-nodep-2.1_3.jar。

还是和上一个样例一样,差别就在于代理的实现。

差别:

JDK的动态代理机制仅仅能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖当中方法实现增强。但由于採用的是继承。所以不能对final修饰的类进行代理。

測试的代码例如以下:

  1. package com.yc.advice;
  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Proxy;
  5. import net.sf.cglib.proxy.Enhancer;
  6. import net.sf.cglib.proxy.MethodInterceptor;
  7. import net.sf.cglib.proxy.MethodProxy;
  8. //这个类是一个切面类。完毕的是向目标类的目标方法增加功能(增强)
  9. public class RightAdvice implements MethodInterceptor{
  10. //代理模式最核心:代理模式中一定要有目标类的引用
  11. private Object targetObject; //注意:这个就是目标类的引用
  12. @Override
  13. public Object intercept(Object proxy, Method method, Object[] args,
  14. MethodProxy arg3) throws Throwable {
  15. String methodName=method.getName();
  16. //调用目标类的相应的发放那个方法
  17. Object returnvalue=method.invoke(targetObject, args);
  18. if(methodName.startsWith("add")||methodName.startsWith("del")||methodName.startsWith("update")){
  19. //在invoke中增加您要增强的代码
  20. check();
  21. }
  22. return returnvalue;
  23. }
  24. //创建一个方法来完毕创建代理对象
  25. //代理模式最核心:代理模式中一定要有目标类的引用
  26. public Object createInstance(Object targetObject){
  27. this.targetObject=targetObject;
  28. Enhancer enhancer=new Enhancer();
  29. //targetObject<- productBizProxy 子类
  30. //TODO 这里要实现推断
  31. enhancer.setSuperclass(targetObject.getClass());
  32. enhancer.setCallback(this);
  33. return enhancer.create();
  34. }
  35. public void check(){
  36. System.out.println("$$$$$$$$$$$$$$$$$$$");
  37. System.out.println("权限检查");
  38. System.out.println("$$$$$$$$$$$$$$$$$$$");
  39. }
  40. }

事实上代理的核心还是在切面类中要有目标类的引用,这种话就能够操作目标类.

測试类:

  1. public class Test {
  2. public static void main(String[] args) {
  3. RightAdvice ra=new RightAdvice();
  4. ProductBizImpl pb=new ProductBizImpl() ;
  5. ProductBizImpl productBizProxy=(ProductBizImpl) ra.createInstance(pb);
  6. productBizProxy.addProduct();
  7. System.out.println("*****************************************88");
  8. }
  9. }

分析cglib源代码:

首先是intercept方法,



通过其凝视的描写叙述,此方法的功能:

全部生成的代理方法调用此方法取代原有的方法。

原始的方法能够使用该方法对象的正常反射调用

public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args,

MethodProxy proxy) throws Throwable;

各个參数:

* @param obj。增强的对象

* @param Method ,被拦截的方法

* @param args方法參数数组;

* @param用来调用超级(非拦截方法)的代理

代理模式之cglib动态代理的更多相关文章

  1. Spring代理模式(CGLIB动态代理模式)

    jdk动态代理和CGLIB动态代理 没什么太大的区别,CGLIB动态代理不需要接口,但是需要导入jar包. 房东出租房子的方法: package com.bjsxt.proxy2; public cl ...

  2. Spring代理模式(jdk动态代理模式)

    有动态代理和静态代理: 静态代理就是普通的Java继承调用方法. Spring有俩种动态代理模式:jdk动态代理模式 和 CGLIB动态代理 jdk动态代理模式: 代码实现: 房东出租房子的方法(继承 ...

  3. 浅谈Java代理二:Cglib动态代理-MethodInterceptor

    浅谈Java代理二:Cglib动态代理-MethodInterceptor CGLib动态代理特点: 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生 ...

  4. 代理模式 & Java原生动态代理技术 & CGLib动态代理技术

    第一部分.代理模式  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常 ...

  5. 代理模式及jdk动态代理原理

    代理模式 :为其它对象提供代理,以控制对这个对象的访问. 代理模式的特征:代理类(proxyClass)与委托类(realClass)有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转 ...

  6. java 代理模式二:动态代理

    java动态代理: java动态代理类位于java.lang.reflect包下,一般主要涉及两个类: 1.Interface InvocationHandler 该接口中仅定义了一个方法:Objec ...

  7. 从静态代理,jdk动态代理到cglib动态代理-一文搞懂代理模式

    从代理模式到动态代理 代理模式是一种理论上非常简单,但是各种地方的实现往往却非常复杂.本文将从代理模式的基本概念出发,探讨代理模式在java领域的应用与实现.读完本文你将get到以下几点: 为什么需要 ...

  8. 代理模式详解:静态代理+JDK/CGLIB 动态代理实战

    1. 代理模式 代理模式是一种比较好的理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标 ...

  9. 代理模式详解:静态代理、JDK动态代理与Cglib动态代理

    代理模式简介分类 概念 ​ 代理,是为了在不修改目标对象的基础上,增强目标方法的业务逻辑. ​ 客户类需要执行的是目标对象的目标方法,但是真正执行的是代理对象的代理方法,客户类对目标对象的访问是通过代 ...

随机推荐

  1. 不做Next,争做Nest——庆科首届智能硬件创新设计大赛产生决赛12强

      智能硬件,Wi-Fi互联,谁是下一个Nest?邀你共见证! 2014年3月到7月.由上海庆科信息技术有限公司主办的首届 MXCHIP 智能硬件创新设计大赛--"寻找下一个nest&quo ...

  2. UVA - 1642 Magical GCD 数学

                                  Magical GCD The Magical GCD of a nonempty sequence of positive integer ...

  3. Object::connect: Cannot queue arguments of type 'QMap<QString,QString>'(要使用qRegisterMetaType<StringMap>进行注册)

    QObject::connect: Cannot queue arguments of type 'QMap<QString,QString>',(Make sure 'QMap<Q ...

  4. 使用神经网络-垃圾邮件检测-LSTM或者CNN(一维卷积)效果都不错【代码有问题,pass】

    from sklearn.feature_extraction.text import CountVectorizer import os from sklearn.naive_bayes impor ...

  5. WCF:目录

    ylbtech-WCF:目录 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbtech.c ...

  6. 如何解决“因为计算机中丢失php_mbstring.dll”

    配置编译环境时,php.exe报系统错误,无法启动此程序,因为计算机中丢失php_mbstring.dll. 在C:\Windows找到php.ini文件,ctrl+f找到extension=php_ ...

  7. jquery 登录,删除提示信息框

    <a onclick="return confirm('确认要退出登录吗?')">退出</a> //删除,修改,添加时提示信息框 (del,edit,add ...

  8. 基于任务的编程模型TAP

    一.引言 在上两个专题中我为大家介绍.NET 1.0中的APM和.NET 2.0中的EAP,在使用前面两种模式进行异步编程的时候,大家多多少少肯定会感觉到实现起来比较麻烦, 首先我个人觉得,当使用AP ...

  9. Route学习笔记

    前言 UrlRoutingModule.class:这块的代码关联了上一篇中路由部分的一个详细说明 一:Route的讲解 1. 路由模板匹配 添加路由: MapRoute 剔除的路由:IgnoreRo ...

  10. javascript中手风琴特效

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...