Java反射和动态代理
反射
通过反射的方式Class.forName(“com.ahu.Person”)可以获取class对象的实例以及其中的属性、方法、构造函数等
动态代理
动态代理:在不修改原业务的基础上,基于原业务方法,进行重新的扩展,实现新的业务。
例子:
1、 旧业务
买家调用action,购买衣服,衣服在数据库的标价为50元,购买流程就是简单的调用。
2、 新业务
在原先的价格上可以使用优惠券,但是这个功能在以前没有实现过,我们通过代理类,代理了原先的接口方法,在这个方法的基础上,修改了返回值。
代理实现流程:
1、 书写代理类和代理方法,在代理方法中实现代理Proxy.newProxyInstance
2、 代理中需要的参数分别为:被代理的类的类加载器soneObjectclass.getClassLoader(),被代理类的所有实现接口new Class[] { Interface.class },句柄方法new InvocationHandler()
3、 在句柄方法中复写invoke方法,invoke方法的输入有3个参数Object proxy(代理类对象), Method method(被代理类的方法),Object[] args(被代理类方法的传入参数),在这个方法中,我们可以定制化的开发新的业务。
4、 获取代理类,强转成被代理的接口
5、 最后,我们可以像没被代理一样,调用接口的认可方法,方法被调用后,方法名和参数列表将被传入代理类的invoke方法中,进行新业务的逻辑流程。
原业务接口IBoss
1 /** 2 * 这是一个业务的接口,这个接口中的业务就是返回衣服的价格 3 * 4 * 5 */ 6 public interface IBoss {//接口 7 int yifu(String size); 8 }
原业务实现类Boss
1 /** 2 * 实现了卖衣服的接口 3 * 自定义了自己的业务,卖裤子 4 * @author wilson 5 * 6 */ 7 public class Boss implements IBoss{ 8 public int yifu(String size){ 9 System.err.println("天猫小强旗舰店,老板给客户发快递----衣服型号:"+size); 10 //这件衣服的价钱,从数据库读取 11 return 50; 12 } 13 public void kuzi(){ 14 System.err.println("天猫小强旗舰店,老板给客户发快递----裤子"); 15 } 16 }
原业务调用
1 public class SaleAction { 2 /** 3 * 不使用代理,直接调用方法 4 * 方法中规定什么业务,就只能调用什么业务,规定什么返回值,就只能输出什么返回值 5 */ 6 @Test 7 public void saleByBossSelf() throws Exception { 8 IBoss boss = new Boss(); 9 System.out.println("老板自营!"); 10 int money = boss.yifu("xxl");// 老板自己卖衣服,不需要客服,结果就是没有聊天记录 11 System.out.println("衣服成交价:" + money); 12 } 13 }
代理类
1 public class ProxyBoss { 2 /** 3 * 对接口方法进行代理 4 */ 5 @SuppressWarnings("unchecked") 6 public static <T> T getProxy(final int discountCoupon, 7 final Class<?> interfaceClass, final Class<?> implementsClass) 8 throws Exception { 9 return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), 10 new Class[] { interfaceClass }, new InvocationHandler() { 11 public Object invoke(Object proxy, Method method, 12 Object[] args) throws Throwable { 13 Integer returnValue = (Integer) method.invoke( 14 implementsClass.newInstance(), args);// 调用原始对象以后返回的值 15 return returnValue - discountCoupon; 16 } 17 }); 18 } 19 }
新业务调用
1 /** 2 * 什么是动态代理? 简单的写一个模板接口,剩下的个性化工作,好给动态代理来完成! 3 */ 4 public class ProxySaleAction { 5 6 /** 7 *使用代理,在这个代理中,只代理了Boss的yifu方法 8 *定制化业务,可以改变原接口的参数、返回值等 9 */ 10 @Test 11 public void saleByProxy() throws Exception { 12 IBoss boss = ProxyBoss.getProxy(10,IBoss.class,Boss.class);// 将代理的方法实例化成接口 13 //IBoss boss = new Boss();// 将代理的方法实例化成接口 14 System.out.println("代理经营!"); 15 int money = boss.yifu("xxl");// 调用接口的方法,实际上调用方式没有变 16 System.out.println("衣服成交价:" + money); 17 } 18 }
转载于:https://www.cnblogs.com/ahu-lichang/p/6739459.html
Java反射和动态代理相关推荐
- throwable四参构造_深入分析Java反射(四)-动态代理
动态代理的简介 Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分 ...
- java反射与动态代理
01.Java反射机制概述 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法. ...
- Java提高班(六)反射和动态代理(JDK Proxy和Cglib)
反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多.要怎么理解以上这句话,请看下文. 一.反射 反射机制是 Ja ...
- 支撑Java框架的基础技术:泛型,反射,动态代理,cglib
以Spring为例要想看明白他的源码需要彻底理解Java的一些基础技术泛型,反射同时对于一些高级技术例如动态代理,cglib和字节码技术也需要掌握,下面就按章节来一一说清楚这些技术的核心部分,最后手写 ...
- java底层 —反射、动态代理
java底层 -反射.动态代理和注解 1. 反射介绍 1.1 反射 反射是指程序可以访问,检测,修改它本身状态或行为的一种能力. 1.2 java的反射机制 java的反射机制是指在程序运行状态中,给 ...
- 死磕java底层(三)—反射、动态代理和注解
1.反射介绍 1.1反射 反射是指程序可以访问,检测,修改它本身状态或行为的一种能力. 1.2java的反射机制 java的反射机制是指在程序运行状态中,给定任意一个类,都可以获取到这个类的属性和方法 ...
- 吃透Java中的动态代理
动态代理在Java中是很重要的一部分,在很多框架中都会用到,如Spring中的AOP.Hadoop中的RPC等.为此在这把我对Java中的动态代理的理解分享给大家,同时写了一个模拟AOP编程的实例.( ...
- 通过反射创建动态代理对象(二)
2019独角兽企业重金招聘Python工程师标准>>> 一.概述 将"通过反射创建动态代理对象(一)"合二为一 二.代码说明 package staticimpo ...
- java 委托_动态代理:Java开发必学
一句话概括:java 动态代理通过反射机制,可在不修改原代码的情况下添加新的功能,应用于多种场景,简单.实用.灵活,是 java 开发必学知识,本文将对动态代理使用进行详细介绍. 1. 引言 最近开发 ...
最新文章
- Objective-C中的Category
- minheight能继承吗_CSS 哪些属性默认会继承, 哪些不会继承?
- 软设考试笔记--UML建模
- mysql cursor 嵌套_MYSQL 存储过程多游标嵌套遍历
- syslog-ng配置说明
- Java 那些最常用的工具类库 | 原力计划
- Windows jmeter安装
- jetson nano使用python读取解析GPS数据(GPRMC,GPGGA)。
- 2022年深圳杯建模A题思路: 破除“尖叫效应”与“回声室效应”,走出“信息茧房”
- 数字图像处理之数字图像频率空间
- 测试用例设计方法有哪些?
- 实对称阵的正交相似对角化
- linux dhcpv6有状态配置,翻译:IPv6地址自动配置:有状态和无状态的区别
- js 获取 当前年月日以及农历日期和星期几
- Gmail被逐出中国客户端也不能收邮件肿么破?
- Unity学习笔记(六)——顶点动画
- 13.爬虫训练场集成文件采集案例,来学习一下怎么实现的
- GNS3实现VPLS实验
- linux怎么打出管道命令这个符号,linux 管道命令 竖线 ‘ | ’
- pip下载第三方库失败
热门文章
- opencv学习(七)之图像卷积运算函数filter2D()
- 「C++」遗传算法求解最佳路径问题——“一日游”行程规划程序
- 苹果id可以同时用两个手机吗_使用苹果手机时,这些需要注意的点,你都知道吗?...
- java api是什么_JAVA_API概述
- 当互联网巨头下场买菜
- 【程序设计训练】3-10 Maya历法
- C语言中strcpy函数的实现
- 【Facebook招聘笔试】查找相同URL
- Java写一个死循环打满CPU和内存
- 客服打字速度慢怎么提高效率