反射

通过反射的方式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反射和动态代理相关推荐

  1. throwable四参构造_深入分析Java反射(四)-动态代理

    动态代理的简介 Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分 ...

  2. java反射与动态代理

    01.Java反射机制概述 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法. ...

  3. Java提高班(六)反射和动态代理(JDK Proxy和Cglib)

    反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多.要怎么理解以上这句话,请看下文. 一.反射 反射机制是 Ja ...

  4. 支撑Java框架的基础技术:泛型,反射,动态代理,cglib

    以Spring为例要想看明白他的源码需要彻底理解Java的一些基础技术泛型,反射同时对于一些高级技术例如动态代理,cglib和字节码技术也需要掌握,下面就按章节来一一说清楚这些技术的核心部分,最后手写 ...

  5. java底层 —反射、动态代理

    java底层 -反射.动态代理和注解 1. 反射介绍 1.1 反射 反射是指程序可以访问,检测,修改它本身状态或行为的一种能力. 1.2 java的反射机制 java的反射机制是指在程序运行状态中,给 ...

  6. 死磕java底层(三)—反射、动态代理和注解

    1.反射介绍 1.1反射 反射是指程序可以访问,检测,修改它本身状态或行为的一种能力. 1.2java的反射机制 java的反射机制是指在程序运行状态中,给定任意一个类,都可以获取到这个类的属性和方法 ...

  7. 吃透Java中的动态代理

    动态代理在Java中是很重要的一部分,在很多框架中都会用到,如Spring中的AOP.Hadoop中的RPC等.为此在这把我对Java中的动态代理的理解分享给大家,同时写了一个模拟AOP编程的实例.( ...

  8. 通过反射创建动态代理对象(二)

    2019独角兽企业重金招聘Python工程师标准>>> 一.概述 将"通过反射创建动态代理对象(一)"合二为一 二.代码说明 package staticimpo ...

  9. java 委托_动态代理:Java开发必学

    一句话概括:java 动态代理通过反射机制,可在不修改原代码的情况下添加新的功能,应用于多种场景,简单.实用.灵活,是 java 开发必学知识,本文将对动态代理使用进行详细介绍. 1. 引言 最近开发 ...

最新文章

  1. Objective-C中的Category
  2. minheight能继承吗_CSS 哪些属性默认会继承, 哪些不会继承?
  3. 软设考试笔记--UML建模
  4. mysql cursor 嵌套_MYSQL 存储过程多游标嵌套遍历
  5. syslog-ng配置说明
  6. Java 那些最常用的工具类库 | 原力计划
  7. Windows jmeter安装
  8. jetson nano使用python读取解析GPS数据(GPRMC,GPGGA)。
  9. 2022年深圳杯建模A题思路: 破除“尖叫效应”与“回声室效应”,走出“信息茧房”
  10. 数字图像处理之数字图像频率空间
  11. 测试用例设计方法有哪些?
  12. 实对称阵的正交相似对角化
  13. linux dhcpv6有状态配置,翻译:IPv6地址自动配置:有状态和无状态的区别
  14. js 获取 当前年月日以及农历日期和星期几
  15. Gmail被逐出中国客户端也不能收邮件肿么破?
  16. Unity学习笔记(六)——顶点动画
  17. 13.爬虫训练场集成文件采集案例,来学习一下怎么实现的
  18. GNS3实现VPLS实验
  19. linux怎么打出管道命令这个符号,linux 管道命令 竖线 ‘ | ’
  20. pip下载第三方库失败

热门文章

  1. opencv学习(七)之图像卷积运算函数filter2D()
  2. 「C++」遗传算法求解最佳路径问题——“一日游”行程规划程序
  3. 苹果id可以同时用两个手机吗_使用苹果手机时,这些需要注意的点,你都知道吗?...
  4. java api是什么_JAVA_API概述
  5. 当互联网巨头下场买菜
  6. 【程序设计训练】3-10 Maya历法
  7. C语言中strcpy函数的实现
  8. 【Facebook招聘笔试】查找相同URL
  9. Java写一个死循环打满CPU和内存
  10. 客服打字速度慢怎么提高效率