JDK动态代理工厂实现
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动态代理工厂实现相关推荐
- java基础5:工厂模式、单例模式、File文件类、递归、IO流、Properties配置文件、网络编程、利用IO流模拟注册登录功能、关于反射、JDK动态代理
1.工厂模式 23种java设计模式之一 1)提供抽象类(基类) 2)提供一些子类,完成方法重写 3)提供一个接口:完成具体子类的实例化对象的创建,不能直接new子类,构造函数私有化. 优点:具体的子 ...
- 【干货】JDK动态代理的实现原理以及如何手写一个JDK动态代理
动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 在解 ...
- JDK动态代理实现简单AOP--转
JDK 动态代理是 java 反射的一个重要特性.它在某种方面为 java 提供了动态性的特性,给应用带来了无限的空间.大名鼎鼎的 Hessian . Spring AOP 基于动态代理实现.本文将简 ...
- jdk动态代理实现原理
写在前面: 大神和diao炸天的亲请绕道.. 关于代理模式的概念这里省去,大家可以放鸟尽情搜.. 关于为什么叫动态代理,个人理解是代理的类是在运行时动态生成的,大家也可以参考网上的理解.. 文笔很差, ...
- Spring JDK动态代理
JDK 动态代理是通过 JDK 中的 java.lang.reflect.Proxy 类实现的.下面通过具体的案例演示 JDK 动态代理的使用. 1. 创建项目 在 MyEclipse 中创建一个名称 ...
- AOP的底层实现-CGLIB动态代理和JDK动态代理
AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础.它是一种面向切面编程的思想.关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来 ...
- 浅谈Spring中JDK动态代理与CGLIB动态代理
前言 Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式 ...
- Java设计模式(五)代理设计模式—静态代理—JDK动态代理—Cglib动态代理
文章目录 什么是代理模式 代理模式应用场景 代理的分类 静态代理 什么是静态代理 深入解析静态代理 小结 动态代理 什么是动态代理 JDK动态代理 原理和实现方式 代码实现 优缺点 Cglib动态代理 ...
- 使用反射生成 JDK 动态代理
反射 反射赋予了我们在运行时分析类和执行类中方法的能力. 通过反射,可以获取任意一个类的所有属性和方法,还可以调用这些方法和属性. 使用反射生成 JDK 动态代理 JDK 动态代理只能为接口创建动态代 ...
最新文章
- 第三部分 基本类型:第16章 数组
- C:#define用法
- PMP知识点(二、整合管理)
- NeurIPS 2020 | 自步对比学习:充分挖掘无监督学习样本
- boost::geometry::strategy::transform::matrix_transformer用法的测试程序
- 第三次学JAVA再学不好就吃翔(part90)--TreeSet
- ssl1692-魔板【HSAH,bfs】
- [js] 手写一个trim()的方法
- 《Reids 设计与实现》第六章 数据库
- SpringGateway与Zookeeper的Maven冲突
- python做爬虫 怎么样效率最高_公认8个效率最高的爬虫框架
- 【小型系统】简单的刷票系统(突破IP限制进行投票)
- 【Spark重点难点】你的数据存在哪了?
- python unpack函数_Lua UnPack函数用法实例
- 网站SEO关键词优化技巧
- 测量学matlab使用心得,测量学实习心得体会4篇
- 钉钉的自动打卡上下班辅助android软件
- 东华大学计算机专业分数线,2019年东华大学各专业录取分数线
- IoT设备配网方式总结
- 【camera专题】 Camera Open/Close (1)