java代理有jdk动态代理、cglib代理,这里只说下jdk动态代理,jdk动态代理主要使用的是java反射机制(既java.lang.reflect包)

对类增强的3种方式:

继承

装饰者

动态代理

动态代理:

一个类不能或不适合直接访问目标对象,可以使用代理对象。

动态代理的目标:

对目标对象的功能增强。

动态代理:程序运行时,使用JDK提供工具类(Proxy),动态创建一个类,此类一般用于代理。

代理:你 -- 代理(增强) -- 厂商

代理类:目标类:被代理的

动态代理使用前提:必须有接口

Object proxyObj= Proxy.newProxyInstance(参数1,参数2,参数3);

参数1:ClassLoader,负责将动态创建类,加载到内存。当前类.class.getClassLoader();

参数2:Class[] interfaces ,代理类需要实现的所有接口(确定方法),被代理类实例.getClass().getInterfaces();

参数3:InvocationHandler, 请求处理类,代理类不具有任何功能,代理类的每一个方法执行时,调用处理类invoke方法。

voke(Object proxy ,Method ,Object[] args)

参数1:代理实例

参数2:当前执行的方法

参数3:方法实际参数。

以下是个动态代理的小demo便于理解

必须要有的接口:

public interface KindWomen {void throwEye(double money);void doSomeThing(double money);
}

实现接口的类,也就是被代理的类,被增强的类:

public class PJL implements KindWomen {@Overridepublic void throwEye(double money){System.out.println("潘金莲抛媚眼"+money);}@Overridepublic void doSomeThing(double money){System.out.println("潘金莲..."+money);}
}

代理工厂类,也就是实现动态代理的核心类:

public class ProxyFactory {public static Object getProxy(final Class clazz) {//参数一:被代理对象的类加载器,固定写法//参数二:被代理对象实现的接口,固定写法//参数三:使用的是策略模式,固定写法,如何调用真实对象的方法Object obj =  Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), new InvocationHandler() {@Override//代理对象调用的任何方法都会触发此方法执行//参数一:代理对象本身的引用,一般不用//参数二:代理对象调用的方法//参数三:代理对象调用的方法的参数public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//前置增强args[0]=Double.parseDouble(args[0]+"")/2;method.invoke(clazz.newInstance(), args[0]);//调用真实对象中的方法//后置增强System.out.println("后置增强!!!");return null;}});return obj;}}

操作类,看效果:

public class XMQ {public static void main(String[] args) {KindWomen wangPo = (KindWomen) ProxyFactory.getProxy(PJL.class);wangPo.throwEye(10);wangPo.doSomeThing(100);}
}

执行代码,效果如下:

潘金莲抛媚眼5.0
后置增强!!!
潘金莲...50.0
后置增强!!!

JDK动态代理工厂实现相关推荐

  1. java基础5:工厂模式、单例模式、File文件类、递归、IO流、Properties配置文件、网络编程、利用IO流模拟注册登录功能、关于反射、JDK动态代理

    1.工厂模式 23种java设计模式之一 1)提供抽象类(基类) 2)提供一些子类,完成方法重写 3)提供一个接口:完成具体子类的实例化对象的创建,不能直接new子类,构造函数私有化. 优点:具体的子 ...

  2. 【干货】JDK动态代理的实现原理以及如何手写一个JDK动态代理

    动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 在解 ...

  3. JDK动态代理实现简单AOP--转

    JDK 动态代理是 java 反射的一个重要特性.它在某种方面为 java 提供了动态性的特性,给应用带来了无限的空间.大名鼎鼎的 Hessian . Spring AOP 基于动态代理实现.本文将简 ...

  4. jdk动态代理实现原理

    写在前面: 大神和diao炸天的亲请绕道.. 关于代理模式的概念这里省去,大家可以放鸟尽情搜.. 关于为什么叫动态代理,个人理解是代理的类是在运行时动态生成的,大家也可以参考网上的理解.. 文笔很差, ...

  5. Spring JDK动态代理

    JDK 动态代理是通过 JDK 中的 java.lang.reflect.Proxy 类实现的.下面通过具体的案例演示 JDK 动态代理的使用. 1. 创建项目 在 MyEclipse 中创建一个名称 ...

  6. AOP的底层实现-CGLIB动态代理和JDK动态代理

    AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础.它是一种面向切面编程的思想.关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来 ...

  7. 浅谈Spring中JDK动态代理与CGLIB动态代理

    前言 Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式 ...

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

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

  9. 使用反射生成 JDK 动态代理

    反射 反射赋予了我们在运行时分析类和执行类中方法的能力. 通过反射,可以获取任意一个类的所有属性和方法,还可以调用这些方法和属性. 使用反射生成 JDK 动态代理 JDK 动态代理只能为接口创建动态代 ...

最新文章

  1. 第三部分 基本类型:第16章 数组
  2. C:#define用法
  3. PMP知识点(二、整合管理)
  4. NeurIPS 2020 | 自步对比学习:充分挖掘无监督学习样本
  5. boost::geometry::strategy::transform::matrix_transformer用法的测试程序
  6. 第三次学JAVA再学不好就吃翔(part90)--TreeSet
  7. ssl1692-魔板【HSAH,bfs】
  8. [js] 手写一个trim()的方法
  9. 《Reids 设计与实现》第六章 数据库
  10. SpringGateway与Zookeeper的Maven冲突
  11. python做爬虫 怎么样效率最高_公认8个效率最高的爬虫框架
  12. 【小型系统】简单的刷票系统(突破IP限制进行投票)
  13. 【Spark重点难点】你的数据存在哪了?
  14. python unpack函数_Lua UnPack函数用法实例
  15. 网站SEO关键词优化技巧
  16. 测量学matlab使用心得,测量学实习心得体会4篇
  17. 钉钉的自动打卡上下班辅助android软件
  18. 东华大学计算机专业分数线,2019年东华大学各专业录取分数线
  19. IoT设备配网方式总结
  20. 【camera专题】 Camera Open/Close (1)

热门文章

  1. CUDA和FFMPEG硬件解码视频流
  2. 高德地图通过基站信息获取经纬度和具体位置
  3. 终于找到工作了,太开心了
  4. 循环赛事日程表JAVA_java实现循环赛日程表
  5. 春晚将采用4K超高清转播;雄安上线区块链租房平台;亚马逊全球范围内裁员丨价值早报
  6. luogu-P5661 公交换乘
  7. C语言 数值交换的三种方法
  8. TinyXML(TinyXPath) 使用总结
  9. np.random的各种不同用法
  10. ES6入门:方括号语法