CGLIB动态代理类

import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor {  private Object target;  /** * 创建代理对象 *  * @param target * @return */  public Object getInstance(Object target) {  this.target = target;  Enhancer enhancer = new Enhancer();  enhancer.setSuperclass(this.target.getClass());  // 回调方法  enhancer.setCallback(this);  // 创建代理对象  return enhancer.create();  }  @Override  // 回调方法  public Object intercept(Object obj, Method method, Object[] args,  MethodProxy proxy) throws Throwable {  System.out.println("事物开始CGLIB");  proxy.invokeSuper(obj, args);  System.out.println("事物结束CGLIB");  return null;  }  }  

java动态代理类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;import org.springframework.aop.framework.AopProxy;public class ClassProxy implements InvocationHandler ,AopProxy{  private Object target;  /** * 绑定委托对象并返回一个代理类 * @param target * @return */  public Object bind(Object target) {  this.target = target;  //取得代理对象  return Proxy.newProxyInstance(target.getClass().getClassLoader(),  target.getClass().getInterfaces(), this);   //要绑定接口(这是一个缺陷,cglib弥补了这一缺陷)  }  @Override  /** * 调用方法 */  public Object invoke(Object proxy, Method method, Object[] args)  throws Throwable {  Object result=null;  System.out.println("事物开始");  //执行方法  result=method.invoke(target, args);  System.out.println("事物结束");  return result;  }@Overridepublic Object getProxy() {System.out.println("test getProxy");return null;}@Overridepublic Object getProxy(ClassLoader classLoader) {System.out.println("test getProxy");return null;}
}

尝试在java动态代理上进行java动态代理或者cglib代理,或者cglib代理上进行java动态代理或者cglib代理测试结果如下:

import java.lang.reflect.Modifier;import org.springframework.aop.framework.AopProxy;public class TestProxy {public static void main(String[] args) {
//      ClassProxy proxy = new ClassProxy();
//      AopProxy bookProxy = (AopProxy) proxy.bind(new ClassProxy());
//      bookProxy.getProxy();
//      int i = bookProxy.getClass().getModifiers();
//        String mods = Modifier.toString(i);
//        System.out.println("Class modifiers: " + mods);
//      CglibProxy cglib = new CglibProxy();
//      ClassProxy bookCglib=(ClassProxy)cglib.getInstance(new ClassProxy());
//      bookCglib.getProxy();
//      ClassProxy bookCglib2=(ClassProxy)cglib.getInstance(bookCglib);
//      bookCglib2.getProxy();//JDK代理后再进行一层jdk代理,测试结果不可以,循环调用,造成代理的死循环
//      ClassProxy proxy = new ClassProxy();
//      AopProxy bookProxy = (AopProxy) proxy.bind(new ClassProxy());
//      AopProxy bookProxy2 = (AopProxy) proxy.bind(bookProxy);
//      bookProxy2.getProxy();//jdk代理后再用cglib进行代理,测试结果不行,因为jdk代理后的类是public final类型的,cglib不能对final的类进行代理
//      ClassProxy proxy = new ClassProxy();
//      AopProxy bookProxy = (AopProxy) proxy.bind(new ClassProxy());
//      bookProxy.getProxy();
//      int i = bookProxy.getClass().getModifiers();
//        String mods = Modifier.toString(i);
//        System.out.println("Class modifiers: " + mods);
//      CglibProxy cglib = new CglibProxy();
//      ClassProxy bookCglib=(ClassProxy)cglib.getInstance(bookProxy);
//      bookCglib.getProxy();//CGlib代理后再进行cglib代理,测试结果不可以  Caused by: java.lang.ClassFormatError: Duplicate method name&signature
//      CglibProxy cglib = new CglibProxy();
//      ClassProxy bookCglib=(ClassProxy)cglib.getInstance(new ClassProxy());
//      ClassProxy bookCglib2=(ClassProxy)cglib.getInstance(bookCglib);
//      bookCglib2.getProxy();//CGlib代理后再进行jdk代理,测试结果不可以,因为CGlib代理后已经改变了类的签名,而jdk必须知道类的接口和实现CglibProxy cglib = new CglibProxy();ClassProxy bookCglib=(ClassProxy)cglib.getInstance(new ClassProxy());  bookCglib.getProxy();ClassProxy proxy = new ClassProxy();AopProxy bookProxy = (AopProxy) proxy.bind(bookCglib);bookProxy.getProxy();}}

转载于:https://www.cnblogs.com/zhwj184/archive/2012/06/01/3119662.html

java动态代理上是否能再进行一层代理相关推荐

  1. 服务器 上传文件进度,Java动态显示文件上传进度实现代码

    本文实例实现文件上传的进度显示,我们先看看都有哪些问题我们要解决. 1 上传数据的处理进度跟踪 2 进度数据在用户页面的显示 就这么2个问题, 第一个问题,主要是组件的选择 必须支持数据处理侦听或通知 ...

  2. java动态代理实现与原理详细分析(代码层面解释了AOP的实现)

    关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式    代理模式是常用的java设计模式, ...

  3. java动态代理实现与原理详细分析(【转载】By--- Gonjan )

    [转载]By---    Gonjan  关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式 ...

  4. Java动态代理实现与分析

    文章目录 静态代理 动态代理 静态代理 静态代理的实现: 假如一个班的同学要向老师交班费,但是都是通过班长把自己的钱转交给老师.这里,班长就是代理学生上交班费.班长就是学生的代理. 首先,我们创建一个 ...

  5. (转)java动态代理实现与原理详细分析

    https://www.cnblogs.com/gonjan-blog/p/6685611.html 1.静态代理 静态代理:由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,被代理类 ...

  6. 【java】java动态代理实现与原理详细分析

    文章目录 一.代理模式 二.静态代理 1.静态代理 2.静态代理简单实现 三.动态代理 1.动态代理 2.动态代理简单实现 四.动态代理原理分析 五.总结 关于Java中的动态代理,我们首先需要了解的 ...

  7. java动态代理实现与原理

    java动态代理实现与原理详细分析 关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式–代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式 代理模 ...

  8. java动态代理简介

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

  9. 02.Java动态代理实现与原理分析之静态代理

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

最新文章

  1. 《Java程序设计》第十一周学习总结
  2. aria-required属性学习笔记
  3. 关于程序员的脑筋急转弯(附答案)
  4. Spring Boot————ApplicationListener实现逃课事件监听
  5. java代码安全检测机制_全面解析:java中的反射机制,内含代码验证解析
  6. 关于如何学好前端开发,你需要知道的事!
  7. Jenkins : 构建伟大,无所不能 —— docker 安装Jenkins(最新版)
  8. vue仿今日头条_字节跳动今日头条前端面经(4轮技术面+hr面)
  9. 鼠标点击改变单元格颜色或点击改变行颜色
  10. Mac 安装 CentOS镜像 及 VMware虚拟机
  11. 转:基于Spark的电影推荐系统(包含爬虫项目、web网站、后台管理系统以及spark推荐系统)
  12. 基于 Iterative 映射和单纯形法的改进灰狼优化算法-附代码
  13. 下载python的三个版本选择
  14. 嵌入式系统开发的基础知识
  15. 微信小程序怎么实现拍照功能,以及授权,拍完照保存到本地。
  16. Best Fitting Hyperplanes for Classification(用于分类的最佳拟合超平面)
  17. 墨迹天气总显示内部服务器更新,为什么墨迹天气无法更新_墨迹天气无法更新解决办法 - 驱动管家...
  18. Java常见面试题—final 在 java 中有什么作用?
  19. 基于Java+数据爬虫+SSM架构实现手机购物网站前后台项目
  20. 括苍山观云海风车 迎第一缕曙光

热门文章

  1. hilb--生成Hilbert(希尔伯特)矩阵
  2. Longest Common Prefix
  3. C++ STL算法之accumulate函数
  4. 在Matlab中使用mex函数进行C/C++混合编程
  5. GMM_example(1)
  6. mysql 存储过程 主键_存储过程生成主键
  7. 使用BeautifulSoup爬虫
  8. 「Python」socket指南
  9. Mui Webview下来刷新上拉加载实现
  10. 【BZOJ 1415】 1415: [Noi2005]聪聪和可可 (bfs+记忆化搜索+期望)