最近在研究java动态代理这块,以前也看了很多次java动态代理,感觉一直不是怎么明白,这两天看了看又明白了些,现给出我参考网上写的一个demo

jdk动态代理实现:

View Code

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class DynamicProxy implements InvocationHandler {private Target target;public DynamicProxy(Target target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("before the work");method.invoke(target, args);System.out.println("after the work");return null;}public Target getProxy() {Class<?>[] interfaces = this.target.getClass().getInterfaces();if (interfaces == null || interfaces.length == 0) {interfaces = new Class<?>[] { Target.class };}Target proxy = (Target) Proxy.newProxyInstance(this.target.getClass().getClassLoader(), interfaces, this);return proxy;}public static void main(String[] args) {Target target = new TargetImpl();new DynamicProxy(target).getProxy().sayHello();}}interface Target {public void sayHello();
}class TargetImpl implements Target {public void sayHello() {System.out.println("hello world");}
}

cglib动态代理demo:

View Code

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 TestCglibProxy {public static void main(String[] args) {Target target = new Target();TestCglibProxy testCglibProxy = new TestCglibProxy();Target targetProxy = (Target) testCglibProxy.createProxy(target.getClass());targetProxy.sayHello();}public Object createProxy(Class targetClass) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(targetClass);enhancer.setCallback(new MethodInteceptor());return enhancer.create();}
}class MethodInteceptor implements MethodInterceptor {@Overridepublic Object intercept(Object object, Method method, Object[] arg2,MethodProxy methodProxy) throws Throwable {System.out.println("start to do the work");Object result = methodProxy.invokeSuper(object, arg2);System.out.println("end:do the work");return "haha";}
}class Target {public void sayHello() {System.out.println("hello world");}
}

jdk实现版本只支持接口的动态代理,如果某个类没有实现接口,他就无法为他进行动态代理,在生成代理对象的时候需要传入的参数就包括“接口”

cglib实现方式不利用接口,而是为现有的类,生成一个子类,然后进行调用.cglib底层实现用asm方式

对于这两种方式的底层具体实现还需要再研究

转载于:https://www.cnblogs.com/striveforver/archive/2012/09/29/2708080.html

java jdk动态代理 cglib动态代理demo相关推荐

  1. Java设计模式(五)代理设计模式—静态代理—JDK动态代理—Cglib动态代理

    文章目录 什么是代理模式 代理模式应用场景 代理的分类 静态代理 什么是静态代理 深入解析静态代理 小结 动态代理 什么是动态代理 JDK动态代理 原理和实现方式 代码实现 优缺点 Cglib动态代理 ...

  2. 静态代理,cglib动态代理,jdk动态代理区别以及流程详解

    1.静态代理 静态代理使用的是代理设计模式,不讲高大上的思想,我们直接实战 这是动物接口,其中有一个吃饭方法 这是其中的一只动物,实现了动物接口,覆盖了吃饭方法 现在我们思考,我想要给猫找一个代理,希 ...

  3. 动态代理——CGLIB动态代理原理示例解析

    觉得可以的话点个关注,转个发呗,陆续奉上干货~~~~ 前文我们讲解了JDK动态代理的原理(动态代理--JDK动态代理原理),今天我们来看看CGLIB动态代理是如何实现,最后我们总结下JDK动态代理和C ...

  4. Java jdk proxy、cglib、aspectj 三种常用代理示范

    JDK Proxy 必须实现接口,没有实现接口用cglib. Animal接口 package com.example.test.jdk_proxy;/*** @Author humorchen* @ ...

  5. Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理

    Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...

  6. Java两种动态代理JDK动态代理和CGLIB动态代理

    目录 代理模式 JDK动态代理 cglib动态代理 测试 代理模式 代理模式是23种设计模式的一种,他是指一个对象A通过持有另一个对象B,可以具有B同样的行为的模式.为了对外开放协议,B往往实现了一个 ...

  7. Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)

    Java之代理... 1 一.         概念... 1 二.         jdk的静态代理... 1 三.         jdk动态代理... 4 四.         cglib 动态 ...

  8. 代理模式(Java版)-静态代理、JDK动态代理和CGLib动态代理

    代理模式前传 前几天有个小朋友问到我代理模式,这个我拿手的嘛.废话不多说,直接开讲?这是不可能的. 一般呢,讲模式之前呢,礼貌上都要讲个前传.象我这种老了根本不怕没有故事祭奠的人,随手一个前传开始. ...

  9. Java 结合实例学会使用 静态代理、JDK动态代理、CGLIB动态代理

    前言 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 很多人至今都是看到 代理就懵, 静态代理.动态代理.JDK动态代理.CGL ...

最新文章

  1. 用于小型图形挖掘研究的瑞士军刀:空手道俱乐部的图表学习Python库
  2. 支付宝发布黑科技“如影计划”,这真的不是愚人节的玩笑
  3. python常见的排序算法_常见排序算法之python实现
  4. pmp考试必知的十个图和表
  5. java 酒店预定 app_Android应用源码酒店在线预定app项目全套
  6. Python高级——多线程(threading)
  7. 项目复盘:从0到1,如何做好竞品分析?
  8. 好的 Web 前端年薪会有多少?
  9. python工程师工资多少-2018年涨工资了吗?Python 工程师薪资最新出炉
  10. 笔记3:Tensorflow2.0实战之MNSIT数据集
  11. puppet详解(四)——package资源详解
  12. 产品经理入门知识梳理(含思维导图
  13. Matlab之数据归一化函数——mapminmax()
  14. 微信公众号 开发详解05【二维码制作、调查表单、短网址、微小宝、引流】
  15. 如何使用荣耀手机的计算机功能,华为荣耀手机投屏电脑教程
  16. linux 查看内网IP和外网IP
  17. 【设计模式 三】实战工厂汽车代工之工厂模式-简单模式
  18. Java虚拟机启动整体流程和基础学习(内容很多,不可快餐阅读),推理+源码论证
  19. 用程序实现基本计算器功能
  20. 用html制作学生成绩表格代码,利用Excel制作学生成绩表.doc

热门文章

  1. 计算机网络—基础概念
  2. SQL面试题--(26~46)
  3. bzoj 1821: [JSOI2010]Group 部落划分
  4. self.modules() 和 self.children()的区别
  5. java中mydoc_实验二/MyDoc.java · 20175326李一潇/20175326java - Gitee.com
  6. U 盘安装 CentOS的方法
  7. 洛谷 P1086 花生采摘
  8. HDU 1010 深搜+奇偶剪枝
  9. 基于Altium Designer的4层PCB板的绘制
  10. 不能不说的C#特性-表达式树