非常重要: 蚂蚁金服年底海量hc,关键竞争压力小,部门核心,千万DAU,6位数QPS,有意向找我内推,可做适当面试指导,机会难得。

刚开始学Java 一般不太会关注到反射,但是如果看很多框架的源码,发现反射无处不在。最近一个业务需求中用了反射,感觉非常丝滑。

前言

鲁班: 什么是反射?

安琪拉: 反射是Java 中提供的运行期获取对象信息的能力。先记住二个关键词:运行期、对象信息。

鲁班: 那为什么Java 需要反射呢? 需要在运行期获取对象信息呢?

安琪拉: 比如你希望调用某个对象的方法,例如下面这段代码:

angela 对象你如果运行期不知道它是否有dance 方法, 可以调用 getClass().getMethod("dance") 判断一下。

鲁班: 那岂不是很弱鸡,我可以直接调 angela.dance() 方法啊!

安琪拉: 你要用 angela.dance() 方法,包里是不是需要 import Angela 类,一定要有确定的Angela 对象,很多框架场景,是不知道目标对象的Class类型的,要动态获取对象的类类型。

鲁班: 我知道了,反射就是运行的时候知道这个对象能不能调某个方法。

安琪拉: 不止如此,反射就是对于任意一个对象,我们能够运行时访问它的方法和属性。

鲁班: 为什么强调运行时?

安琪拉: 因为是编译期,类型是确定的,很多时候在拿不到确定的对象的属性和值的时候,需要运行时动态调用方法或获取属性。后面会介绍一个通用框架能力通过反射实现的sample。

先说 Java 反射API相关的类有下面几个:

这里可以引出一个很有意思的话题,Java 中一切皆对象,那Class 也是对象,另外所有对象都有对应的Class(类),Class(类)就像饼干模板,Object(对象)是根据Class(类) 做出的饼干,那JDK 加载时先有Class 还是先有Object 呢?如何加载 ?这个可以留个思考题。

真实业务场景

鲁班: 那知道反射有什么用? 对我平常写 curd 有帮助吗?

安琪拉: 有几点原因要知道反射,一个是一些框架代码里面会有很多反射,例如, 我们经常接触的动态代理, Spring的自定义注解。另外我们如果希望把从业务层代码抽象出一些平台能力,就可以用反射。

鲁班: 你这么说没有体感,能不能举个例子?

安琪拉: 那你继续说说上次你的需求。

鲁班:你说我最近接到了一个需求啊,要在下路把对方每一波过来的小兵做标注,只有遇到特定的小兵,我才开火。

安琪拉: 那这些小兵有什么特点呢? 你打算怎么精准定位要开火的小兵?

鲁班:如果小兵身上的符文是红色符文(除此以外,还有蓝色符文和紫色符文),法术防御是魔法防御(除此以外,还有物理防御),我只对这些小兵开火,当然咯,可能以后还需要对带各种属性组合的小兵进行开火打击。

安琪拉: 需求我大概清楚了,你有思路了吗?我们先把模型建立起来,如下图所示,是小兵的模型

鲁班:你上次说了,写业务代码的时候要考虑通用性和可扩展性,但是这个功能也能用反射吗?

安琪拉: 我们拆解一下需求,希望对于指定对象,这个对象上具有指定属性值或某些属性值时,我们做一些后置业务处理。这个是我们做的业务逻辑抽象。

安琪拉: 我们列一下有几个变量: 对象不确定、提取的属性不确定、 提取属性的个数不确定、属性值不确定,最后是要做的后续业务处理逻辑不确定。怎么把模型做的足够通用呢? 我们来设计一下。

鲁班:但是产品给我这个需求就是判断小兵对象的符文和防御属性值啊?

安琪拉: 如果只是按照产品的需求搞,以后有的改,所以索性一次把模型设计的通用。我们可以这个搞:

安琪拉: 我们抽象后可以把这个服务叫做定位服务,如上所示,我们希望无论是什么对象,可以判断对象的指定属性值和预期值是否一致。这里用反射获取到属性的get 方法,然后调用get 方法获取属性值,和预期值做比较,这里 getReadMethod 方法为了方便说明做了简化,很多情况没写进入,比如属性是boolean 类型,get方法前缀是is,比如是父类或接口的方法等等。

鲁班:这样写有什么好处呢?

安琪拉: 这样就把原来的只对Batman 对象的属性做判断做了一层抽象,这样以后类似的需求都可以满足了。我们来做一下对比:

鲁班:这二个方案都是判断 batman(小兵)身上带的 rune(符文)是不是红色,如果是红色,就开火。但是新方案用了反射,有什么优势吗?

安琪拉: 实际业务场景里面,规则往往比这个复杂很多,而且还会一直变化,怎么把方案做的通用性和可扩展性更新,同时性能损耗减少到最少使我们要考虑的问题。例如:产品经理跟你说,这次除了对batman(小兵)身上带的 rune(符文)一定是红色开火,条件还要加一条必须盔甲是防法术伤害的才开火,或者是二者满足其中一条就开火,除了batman(小兵)做判断,也要对野怪、对方英雄做属性值判断。

鲁班:你的意思是业务需求这么变,我用反射做了通用性功能,可以不需要重复写代码吗?

安琪拉: 对呀。到时候你可以抽更多时间来研究

你不得不知道的反射(非常重要)相关推荐

  1. python 函数调用 不允许关键字参数_你所不知道的Python|函数参数的演进之路

    原标题:你所不知道的Python|函数参数的演进之路 函数参数处理机制是Python中一个非常重要的知识点,随着Python的演进,参数处理机制的灵活性和丰富性也在不断增加,使得我们不仅可以写出简化的 ...

  2. 80%开发者都不知道的以太坊骚操作:「事件」和「日志」还可以这么玩!

    80%开发者都不知道的以太坊骚操作:「事件」和「日志」还可以这么玩! 2018年05月02日 00:00:00 阅读数:366 作者 | 蔡一  志顶科技技术总监 4月6日,Daniel Larime ...

  3. 你所不知道的setTimeout

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...

  4. 你真的会玩SQL吗?你所不知道的 数据聚合

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  5. 关于插画师,大家不知道的“秘密”

    关于插画师,大家不知道的"秘密" 现如今,插画师是已然成为了一个吸金又吸睛的火爆职业,学习插画师往后的就业面也是非常的广泛,无论是从事广告行业.动漫行业.亦或者是出版行业,甚至是成 ...

  6. LHS 和 RHS---你所不知道的JavaScript

    目录 1.LHS(Left Hand Side)和 RHS(Right Hand Side) 2.实例详解 3.总结 变量的赋值操作会执行两个动作, 首先编译器会在当前作用域中声明一个变量(如果之前没 ...

  7. 佳能eosr控制环能否计算机控制,关于全画幅微单相机 你可能不知道的十件事

    01关于微单相机你不知道的十件事 2018年之前,全画幅微单领域没有竞争,索尼一家独大,徕卡只走奢侈路线.为了满足专业摄影师和资深发烧玩家更多的使用需求,佳能.尼康和松下纷纷加入战局,在2018年开启 ...

  8. 读书 | 5件富人都在做穷人却不知道的事情

    作者 | 杨小爱 习惯,就是我们长期以来养成的行为方式,这是美国作家托马斯科里在<富有的习惯>一书中对习惯的定义. 而我对习惯的理解就是,习惯就好像我们每天起床后会自然而然的去洗脸刷牙一样 ...

  9. Android关于Path你所知道的和不知道的一切

    零.前言 1.canvas本身提供了很多绘制基本图形的方法,普通绘制基本满足 2.但是更高级的绘制canvas便束手无策,但它的一个方法却将图形的绘制连接到了另一个次元 3.下面进入Path的世界,[ ...

最新文章

  1. Blender建筑可视化技能学习视频教程
  2. 蓝底换白底边缘不干净_雨刮器刮不干净别急着换,老司机教你一招,让雨刮器恢复如新!...
  3. 是什么包_包粽子教程,喜欢的收藏,以后想吃什么样的都可以自己包
  4. 代码规范(一)——java篇
  5. 如何处理Java注释
  6. web服务器mysql日志分析
  7. ​​​​​​​​CloudMounter:挂载云存储作为在 Mac 的本地磁盘
  8. 小猫钓鱼——栈和队列的应用(C++)
  9. C语言1379最小公倍数,求最小公倍数的三种方法
  10. unity3d shader 自定义光照函数
  11. GTASA圣安地列斯 DirectX 2.0 ENB 下窗口化运行的解决办法
  12. Opencv学习笔记 - 使用opencvsharp和支持向量机
  13. 自定义形状的ImageView制作
  14. dalong(大龙燚火锅)
  15. 数据丢包怎么修复_网络丢包率高怎么办
  16. Web爬虫|入门教程之爬虫简介
  17. python判断性别_惊呆|根据三围数据判断出用户性别竟是python使用逻辑回归算法搞的鬼!...
  18. 中国天然大豆卵磷脂市场趋势报告、技术动态创新及市场预测
  19. 024 正交向量 正交矩阵及性质
  20. 编译原理 | 实验四 | 逆波兰式

热门文章

  1. Android打开/关闭屏幕和设置系统屏幕亮度方法
  2. React实战开发-----一个有关兰州疫情分析的软件,本人负责前端开发,本博客记录整个开发的流程,供大家参考
  3. 漫画 | 是程序员堕落了,还是老板堕落了?
  4. odp 加固 mysql_安装使用ODP.Net 问题及说明
  5. FFmpeg源码分析:写音视频帧av_write_frame()
  6. 从Windows 10共享文件夹给Docker虚拟机中的Docker的神奇bug
  7. 年关将至,VR全景在这些行业大显身手的机会来了!
  8. HTML连载46-浮动元素字围现象、浮动练习
  9. 天灵灵地灵灵,送走Live Messenger的广告,快显灵
  10. Android Studio中的逐帧动画